#include using namespace std; typedef long long ll; typedef long double ld; int tmp[26]; struct Data { int cnt[26]; Data() { for (int i = 0; i < 26; i++) { cnt[i] = 0; } } Data(char c) { for (int i = 0; i < 26; i++) { cnt[i] = 0; } cnt[c - 'a'] = 1; } }; Data shift(Data x, int y) { y %= 26; for (int i = 0; i < 26; i++) { tmp[i] = x.cnt[i]; } for (int i = 0; i < 26; i++) { int xx = i - y; if (xx < 0) xx += 26; x.cnt[i] = tmp[xx]; } return x; } Data merge(Data l, Data r) { Data res; for (int i = 0; i < 26; i++) { res.cnt[i] = l.cnt[i] + r.cnt[i]; } return res; } const int MAXN = 100 * 1000 + 7; Data t[4 * MAXN]; int mod[4 * MAXN]; char s[MAXN]; void build(int v, int tl, int tr) { if (tl == tr) { t[v] = Data(s[tl - 1]); } else { int tm = (tl + tr) / 2; build(2 * v, tl, tm); build(2 * v + 1, tm + 1, tr); t[v] = merge(t[2 * v], t[2 * v + 1]); } } void push(int v) { mod[2 * v] += mod[v]; mod[2 * v + 1] += mod[v]; mod[v] = 0; } Data getData(int v) { return shift(t[v], mod[v]); } void shift(int v, int tl, int tr, int l, int r, int x) { if (r < tl || l > tr) return; if (tl >= l && tr <= r) { mod[v] += x; mod[v] %= 26; } else { push(v); int tm = (tl + tr) / 2; shift(2 * v, tl, tm, l, r, x); shift(2 * v + 1, tm + 1, tr, l, r, x); t[v] = merge(getData(2 * v), getData(2 * v + 1)); } } Data get(int v, int tl, int tr, int l, int r) { if (r < tl || l > tr) return Data(); if (tl >= l && tr <= r) return getData(v); push(v); int tm = (tl + tr) / 2; Data res = merge(get(2 * v, tl, tm, l, r), get(2 * v + 1, tm + 1, tr, l, r)); t[v] = merge(getData(2 * v), getData(2 * v + 1)); return res; } const ll MOD = 1000 * 1000 * 1000 + 7; ll pw[MAXN]; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif pw[1] = 1; for (int i = 2; i < MAXN; i++) { pw[i] = (pw[i - 1] * 2) % MOD; } int n, q; scanf("%d %d", &n, &q); scanf("%s", s); build(1, 1, n); for (int i = 1; i <= q; i++) { int type; scanf("%d", &type); if (type == 1) { int l, r, x; scanf("%d %d %d", &l, &r, &x); l++; r++; shift(1, 1, n, l, r, x); } else { int l, r; scanf("%d %d", &l, &r); l++; r++; Data cur = get(1, 1, n, l, r); ll res = 1; int cnt = 0, cntBig = 0; for (int i = 0; i < 26; i++) { if (cur.cnt[i] == 0) continue; res = (res * pw[cur.cnt[i]]) % MOD; cnt++; } res = (res * (cnt + 1) + MOD - 1) % MOD; printf("%lld\n", res); } } }