#include using namespace std; const int N = 100005; const int mod = 1000000007; inline int mul(int a, int b) { return (a * 1LL * b) % mod; } inline int add(int a, int b) { int res = a + b; if (res >= mod) res -= mod; if (res < 0) res += mod; return res; } int power(int a, int b) { int res = 1; while (b > 0) { if (b & 1) res = mul(res, a); a = mul(a, a); b /= 2; } return res; } int a[N], lazy[4 * N]; char s[N]; vector tr[4 * N]; int next(int x, int d) { return (x + d) % 26; } vector merge(vector A, vector B) { assert(A.size() == B.size() && A.size() == 26); vector res(26, 0); for (int i = 0; i < 26; ++i) { res[i] = A[i] + B[i]; } return res; } void push(int x, int b, int e) { if (lazy[x]) { vector another(26, 0); for (int i = 0; i < 26; ++i) { another[next(i, lazy[x])] = tr[x][i]; } tr[x] = another; if (b < e) { lazy[x + x] = (lazy[x] + lazy[x + x]) % 26; lazy[x + x + 1] = (lazy[x] + lazy[x + x + 1]) % 26; } lazy[x] = 0; } } int get(vector v) { assert(v.size() == 26); int pos = 0, sm = 0; for (int i = 0; i < 26; ++i) { if (v[i]) pos++, sm += v[i] - 1; } return add(add(power(2, sm), -1), mul(pos, power(2, sm))); } void build(int x, int b, int e) { if (b >= e) { tr[x].resize(26, 0); tr[x][a[b]] = 1; } else { int mid = (b + e) >> 1; build(x + x, b, mid); build(x + x + 1, mid + 1, e); tr[x] = merge(tr[x + x], tr[x + x + 1]); } } void update(int x, int b, int e, int l, int r, int shif) { push(x, b, e); if (b > r || e < l) return; if (b >= l && e <= r) { lazy[x] = (lazy[x] + shif) % 26; push(x, b, e); return ; } int mid = (b + e) >> 1; update(x + x, b, mid, l, r, shif); update(x + x + 1, mid + 1, e, l, r, shif); tr[x] = merge(tr[x + x], tr[x + x + 1]); } vector query(int x, int b, int e, int l, int r) { push(x, b, e); if (b > r || e < l) return vector (26, 0); if (b >= l && e <= r) return tr[x]; int mid = (b + e) >> 1; return merge(query(x + x, b, mid, l, r), query(x + x + 1, mid + 1, e, l, r)); } int main() { int n, q; scanf("%d %d", &n, &q); scanf("%s", s); for (int i = 0; i < n; ++i) { a[i] = s[i] - 'a'; } build(1, 0, n - 1); while (q--) { int ty; scanf("%d", &ty); if (ty == 1) { int l, r, shif; scanf("%d %d %d", &l, &r, &shif); update(1, 0, n - 1, l, r, shif); } else { int l, r; scanf("%d %d", &l, &r); printf("%d\n", get(query(1, 0, n - 1, l, r))); } } return(0); }