#include using namespace std; const int MAXN = 1e5; typedef long long Long; const Long MOD = 1e9 + 7; int n; int cc[30][4 * MAXN + 10]; int CC[30]; int prop[4*MAXN + 10]; Long P[MAXN + 10]; string ss; void build(int cn, int b, int e) { if(b == e) { cc[ss[b-1]-'a'][cn] = 1; return; } int m = (b + e) / 2; build(2 * cn, b, m); build(2 * cn + 1, m+1, e); for(int i = 0; i < 26; i++) { cc[i][cn] = cc[i][2*cn] + cc[i][2*cn+1]; } } void upd(int cn, int b, int e, int l, int r, int p, int x) { prop[cn] = (prop[cn] + p) % 26; for(int c = 0; c < 26; c++) { CC[(c+p)%26] = cc[c][cn]; } for(int c = 0; c < 26; c++) { cc[c][cn] = CC[c]; } if(r < b || l > e) return; if(l <= b && e <= r) { prop[cn] = (prop[cn] + x) % 26; for(int c = 0; c < 26; c++) { CC[(c+x)%26] = cc[c][cn]; } for(int c = 0; c < 26; c++) { cc[c][cn] = CC[c]; } return; } int m = (b + e) / 2; upd(2 * cn, b, m, l, r, prop[cn], x); upd(2 * cn + 1, m + 1, e, l, r, prop[cn], x); prop[cn] = 0; for(int c = 0; c < 26; c++) { cc[c][cn] = cc[c][2*cn] + cc[c][2*cn+1]; } } int get(int cn, int b, int e, int l, int r, int c, int p) { if(r < b || l > e) return 0; if(l <= b && e <= r) return cc[(c-p+26)%26][cn]; int m = (b + e) / 2; p = (prop[cn] + p) % 26; int L = get(2 * cn, b, m, l, r, c, p); int R = get(2 * cn + 1, m + 1, e, l, r, c, p); return L + R; } int f(int l, int r) { Long nx = 1; for(int c = 25; c >= 0; c--) { Long cnt = get(1, 1, n, l, r, c, 0); if(cnt > 0) nx = (P[cnt-1] * nx) % MOD; } Long res = (nx - 1 + MOD) % MOD; for(int c = 0; c < 26; c++) { Long cnt = get(1, 1, n, l, r, c, 0); if(cnt > 0) res += (nx) % MOD; res %= MOD; } return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; int Q; cin >> Q; cin >> ss; build(1, 1, n); P[0] = 1; for(int i = 1; i <= n; i++) { P[i] = (P[i-1] * 2LL) % MOD; } for(int q = 0; q < Q; q++) { int tp; cin >> tp; if(tp == 1) { int l, r, x; cin >> l >> r >> x; upd(1, 1, n, l+1, r+1, 0, x); } else { int l, r; cin >> l >> r; cout << f(l+1,r+1) << "\n"; } } }