//Giorgi Kldiashvili && Saba Tavdgiridze #include #define M 1000000007LL #define ll long long #define pb push_back using namespace std; int n, testcase; int A[100020], T[800020][30], t[800020]; int a[26], S[26]; ll P[100020]; ll ans, answer; inline void shuff(int v, int val) { val %= 26; if(val == 0) return; for(int i = 0; i < 26; ++ i) a[(i + val) % 26] = T[v][i]; for(int i = 0; i < 26; ++ i) T[v][i] = a[i]; } void Build(int v, int tl, int tr) { if(tl == tr - 1) { T[v][A[tl]] ++; return; } Build(v + v, tl, tl + tr >> 1); Build(v + v + 1, tl + tr >> 1, tr); for(int i = 0; i < 26; ++ i) T[v][i] = T[v + v][i] + T[v + v + 1][i]; } void update(int v, int tl, int tr, int l, int r, int val) { if(tl >= r || tr <= l) { shuff(v, t[v]); t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; return; } if(l <= tl && tr <= r) { t[v] = (val + t[v]) % 26; shuff(v, t[v]); t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; return; } t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; update(v + v, tl, tl + tr >> 1, l, r, val); update(v + v + 1, tl + tr >> 1, tr, l, r, val); for(int i = 0; i < 26; ++ i) T[v][i] = T[v + v][i] + T[v + v + 1][i]; } void get(int v, int tl, int tr, int l, int r) { if(tl >= r || tr <= l) { shuff(v, t[v]); t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; return; } if(l <= tl && tr <= r) { shuff(v, t[v]); t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; for(int i = 0; i < 26; ++ i) S[i] += T[v][i]; return; } t[v + v] += t[v]; t[v + v + 1] += t[v]; t[v] = 0; get(v + v, tl, tl + tr >> 1, l, r); get(v + v + 1, tl + tr >> 1, tr, l, r); for(int i = 0; i < 26; ++ i) T[v][i] = T[v + v][i] + T[v + v + 1][i]; } int main() { P[0] = 1; for(int i = 1; i < 1e5; ++ i) P[i] = (P[i - 1] * 2) % M; scanf("%d %d", &n, &testcase); for(int i = 0; i < n; ++ i) { char ch = getchar(); while(ch < 'a' || ch > 'z') ch = getchar(); A[i] = ch - 'a'; } Build(1, 0, n); while(testcase --) { int op; scanf("%d", &op); if(op == 1) { int l, r, val; scanf("%d %d %d", &l, &r, &val); val %= 26; r ++; if(val == 0) continue; update(1, 0, n, l, r, val); } else { int l, r; scanf("%d %d", &l, &r); r ++; for(int i = 0; i < 26; ++ i) S[i] = 0; get(1, 0, n, l, r); answer = 1; //for(int i = 0; i < 26; ++ i) printf("%d ", S[i]); printf("\n"); for(int i = 0; i < 26; ++ i) { if(S[i] == 0) continue; answer = (answer * P[S[i] - 1]) % M; } ans = answer; for(int i = 0; i < 26; ++ i) if(S[i] > 0) answer = (answer + ans) % M; answer = (answer + M - 1) % M; printf("%lld\n", answer); } } }