#include using namespace std; const int mod = 1e9 + 7; const int N = 1 << 17; int add(int x, int y) { return (x += y) >= mod ? x - mod : x; } int mul(int x, int y) { return 1LL * x * y % mod; } int sum[N * 2][26]; int lazy[N * 2]; void setLazy(int k, int v) { int buf[26]; for (int i = 0; i < 26; i++) { buf[i] = sum[k][i]; } for (int i = 0; i < 26; i++) { sum[k][(i + v) % 26] = buf[i]; } lazy[k] += v; } void push(int k) { if (lazy[k] == 0) { return; } setLazy(k * 2 + 0, lazy[k]); setLazy(k * 2 + 1, lazy[k]); lazy[k] = 0; } void update(int ql, int qr, int v, int k = 1, int nl = 0, int nr = N) { if (nr <= ql || qr <= nl) { return; } if (ql <= nl && nr <= qr) { setLazy(k, v); return; } push(k); int nm = (nl + nr) / 2; update(ql, qr, v, k * 2 + 0, nl, nm); update(ql, qr, v, k * 2 + 1, nm, nr); for (int i = 0; i < 26; i++) { sum[k][i] = sum[k * 2][i] + sum[k * 2 + 1][i]; } } int result[26]; void query(int ql, int qr, int k = 1, int nl = 0, int nr = N) { if (nr <= ql || qr <= nl) { return; } if (ql <= nl && nr <= qr) { for (int i = 0; i < 26; i++) { result[i] += sum[k][i]; } return; } push(k); int nm = (nl + nr) / 2; query(ql, qr, k * 2 + 0, nl, nm); query(ql, qr, k * 2 + 1, nm, nr); } int main() { int n, q; cin >> n >> q; string s; cin >> s; for (int i = 0; i < s.size(); i++) { sum[i + N][s[i] - 'a']++; } for (int i = N - 1; i >= 1; i--) { for (int j = 0; j < 26; j++) { sum[i][j] = sum[i * 2][j] + sum[i * 2 + 1][j]; } } vector p2(n + 1); p2[0] = 1; for (int i = 1; i <= n; i++) { p2[i] = mul(2, p2[i - 1]); } while (q--) { int t; scanf("%d", &t); if (t == 1) { int l, r, v; scanf("%d %d %d", &l, &r, &v); v %= 26; update(l, r + 1, v); } else { int l, r; scanf("%d %d", &l, &r); for (int i = 0; i < 26; i++) { result[i] = 0; } query(l, r + 1); int even = 1; for (int i = 0; i < 26; i++) { even = mul(even, p2[max(0, result[i] - 1)]); } even = add(even, mod - 1); int odd = 0; for (int i = 0; i < 26; i++) { int pat = 1; for (int j = 0; j < 26; j++) { if (i == j) { if (result[j] == 0) { pat = 0; } else { pat = mul(pat, p2[max(0, result[j] - 1)]); } } else { pat = mul(pat, p2[max(0, result[j] - 1)]); } } odd = add(odd, pat); } printf("%d\n", add(even, odd)); } } }