#include #define pp pop_back #define pb push_back #ifdef KTL #define fname "" #else #define fname "travel." #endif #define forn(i, x, n) for (int i = int(x); i <= int(n); ++i) #define for1(i, n, x) for (int i = int(n); i >= int(x); --i) #define mp make_pair #define s second #define f first #define sz(a) (int)((a).size()) using namespace std; typedef long long ll; typedef long double ld; typedef pair < int, int > pi; const int N = 1e6; const int mod = 1e9 + 7; void add(int &a, int b) { a += b; if (a >= mod) a -= mod; } int mult(int a, int b) { return 1ll * a * b % mod; } int sum(int a, int b) { add(a, b); return a; } struct node { int cnt[30], add; } T[N * 4]; int n, q, dp[3], pw[N], cnt[30], tmp[30], d[3]; char a[N]; void build(int v = 1, int tl = 1, int tr = n) { if (tl == tr) { T[v].cnt[a[tl] - 'a']++; return; } int tm = (tl + tr) / 2; build(v * 2, tl, tm); build(v * 2 + 1, tm + 1, tr); for (int i = 0;i < 26;i++) T[v].cnt[i] = sum(T[v * 2].cnt[i], T[v * 2 + 1].cnt[i]); } void push(int v, int tl, int tr) { T[v].add %= 26; if (tl != tr) { T[v * 2].add += T[v].add; T[v * 2 + 1].add += T[v].add; } for (int i = 0;i < 26;i++) tmp[(i + T[v].add) % 26] = T[v].cnt[i]; for (int i = 0;i < 26;i++) T[v].cnt[i] = tmp[i]; T[v].add = 0; } void upd(int l, int r, int x, int v = 1, int tl = 1, int tr = n) { push(v, tl, tr); if (tl > r || tr < l) return; if (l <= tl && tr <= r) { T[v].add += x; push(v, tl, tr); return; } int tm = (tl + tr) / 2; upd(l, r, x, v * 2, tl, tm); upd(l, r, x, v * 2 + 1, tm + 1, tr); for (int i = 0;i < 26;i++) T[v].cnt[i] = sum(T[v * 2].cnt[i], T[v * 2 + 1].cnt[i]); } void get(int l, int r, int v = 1, int tl = 1, int tr = n) { push(v, tl, tr); if (tl > r || tr < l) return; if (l <= tl && tr <= r) { for (int i = 0;i < 26;i++) cnt[i] += T[v].cnt[i]; return; } int tm = (tl + tr) / 2; get(l, r, v * 2, tl, tm); get(l, r, v * 2 + 1, tm + 1, tr); } int main() { #ifdef wws freopen("in", "r", stdin); #endif ios_base :: sync_with_stdio(NULL), cin.tie(NULL), cout.tie(NULL); cin >> n >> q; pw[0] = 1; for (int i = 1;i <= n;i++) { cin >> a[i]; pw[i] = mult(pw[i - 1], 2); } build(); while(q--) { int t, l, r; cin >> t >> l >> r;l++, r++; //cout << t << " " << l << " " << r << endl; if (t == 1) { int x; cin >> x; x %= 26; //cout << "x = " << x << endl; upd(l, r, x); } else { get(l, r); //for (int i = 0;i < 26;i++) cout << "i = " << i << " cn = " << cnt[i] << endl; dp[0] = 1; dp[1] = 0; for (int i = 0;i < 26;i++) { int x = cnt[i]; cnt[i] = 0; if (x == 0) { d[0] = dp[0]; d[1] = dp[1]; } else { int ways = pw[x - 1]; d[0] = mult(ways, dp[0]); d[1] = sum(mult(ways, dp[0]), mult(ways, dp[1])); } for (int j = 0;j < 2;j++) dp[j] = d[j], d[j] = 0; } add(dp[0], mod - 1); cout << sum(dp[0], dp[1]) << endl; } } return 0; }