#include #define forn(i, n) for (int i = 0; i < n; i++) #define re return #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) (int)a.size() #define x first #define y second #define point pair #define re return #define se second #define fi first #define mp(a, b) make_pair(a, b) #define mp1(a, b, c, d) make_pair(mp(a, b), mp(c, d)) using namespace std; typedef long long ll; const int ma = 131072; const ll mod = (1e9) + 7; int seg[26][2 * ma], psm[2 * ma], sum[26]; long long ans[2][100001], n; void plus1(int nu, int l, int r, int ql, int qr, int p) { if (r <= ql || l >= qr) { re; } if (ql <= l && r <= qr) { psm[nu] = (psm[nu] + p) % 26; re; } int mid = (l + r) / 2; plus1(2 * nu, l, mid, ql, qr, p); plus1(2 * nu + 1, mid, r, ql, qr, p); forn (i, 26) { seg[i][nu] = 0; } forn (i, 26) { seg[(i + psm[2 * nu]) % 26][nu] += seg[i][2 * nu]; seg[(i + psm[2 * nu + 1]) % 26][nu] += seg[i][2 * nu + 1]; } } void plusk(int nu, int l, int r, int ql, int qr, int c) { c = (c + psm[nu]) % 26; if (r <= ql || l >= qr) { re; } if (ql <= l && r <= qr) { forn (i, 26) { sum[(i + c) % 26] += seg[i][nu]; } re; } int mid = (l + r) / 2; plusk(2 * nu, l, mid, ql, qr, c); plusk(2 * nu + 1, mid, r, ql, qr, c); } int main() { iostream::sync_with_stdio(0); //freopen("a.in", "r", stdin); ans[0][0] = 1; ans[0][1] = ans[1][1] = 1; for (int j = 2; j <= 100000; j++) { ans[0][j] = ans[1][j] = (ans[0][j - 1] * 2LL) % mod; } int n, q; string s; cin >> n >> q >> s; forn (i, sz(s)) { seg[s[i] - 'a'][i + ma] = 1; } for (int j = ma - 1; j; j--) { forn (k, 26) seg[k][j] = seg[k][2 * j] + seg[k][2 * j + 1]; } forn (j, q) { int t, l, r, k; cin >> t >> l >> r; if (t == 1) { cin >> k; plus1(1, ma, 2 * ma, l + ma, r + ma + 1, k); continue; } else { forn (i, 26) sum[i] = 0; plusk(1, ma, 2 * ma, l + ma, r + ma + 1, 0); } //continue; ll ansk = 0, c = 1; forn (j, 26) { //cout << sum[j] << " "; c = (c * ans[0][sum[j]]) % mod; } //cout << endl; ansk += c; forn (j, 26) { if (sum[j]) ansk = (ansk + c) % mod; } ansk = (ansk + mod - 1) % mod; cout << ansk << "\n"; } }