#include #define maxn 100009 #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 using namespace std; const int MOD=1e9+7; int tree[maxn << 2][30], lazy[maxn << 2]; char s[maxn]; int a[maxn]; int n,m; int ans[30]; long long dp[30][2],bin[maxn]; void pushup(int rt){ for(int i = 0; i < 26; i++) tree[rt][i] = tree[rt << 1][i] + tree[rt << 1 | 1][i]; } void build(int l, int r,int rt){ if(l == r){ tree[rt][a[l]]++; return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); } void add(int rt, int t){ int tmp[30] = {0}; for(int i = 0; i < 26; i++) tmp[(i + t) % 26] = tree[rt][i]; for(int i = 0; i < 26; i++) tree[rt][i] = tmp[i]; } void pushdown(int rt){ lazy[rt << 1] += lazy[rt]; lazy[rt << 1] %= 26; lazy[rt << 1 | 1] += lazy[rt]; lazy[rt << 1 | 1] %= 26; add(rt << 1, lazy[rt]); add(rt << 1 | 1, lazy[rt]); lazy[rt] = 0; } void update(int L, int R, int t, int l, int r, int rt){ if(L <= l && r <= R){ add(rt,t); lazy[rt] += t; lazy[rt] %= 26; return; } pushdown(rt); int m = (l + r) >> 1; if(L <= m) update(L, R, t, lson); if(R > m) update(L, R, t, rson); pushup(rt); return; } void query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R){ for(int i = 0; i < 26; i++) ans[i] += tree[rt][i]; return; } pushdown(rt); int m = (l + r) >> 1; if(L <= m) query(L, R, lson); if(R > m) query(L, R, rson); pushup(rt); return; } int main(){ bin[0] = 1; for(int i = 1; i < maxn; i++) bin[i] = bin[i - 1] * 2 % MOD; cin >> n >> m; scanf("%s",s); for(int i = 0; i < n; i++) a[i] = s[i] - 'a'; build(0, n-1, 1); while(m--){ int op, l, r, t; scanf("%d", &op); if(op == 1){ scanf("%d%d%d" ,&l, &r, &t); t %= 26; update(l, r, t, 0, n - 1, 1); } else{ scanf("%d%d", &l, &r); memset(ans, 0, sizeof(ans)); query(l, r, 0, n - 1, 1); dp[0][0] = 1; dp[0][1] = 0; for(int i = 1; i <= 26; i++){ if(ans[i - 1] == 0){ dp[i][0] = dp[i - 1][0]; dp[i][1] = dp[i - 1][1]; } else{ dp[i][0] = dp[i - 1][0] * bin[ans[i - 1] - 1] % MOD; dp[i][1] = (dp[i - 1][1] + dp[i - 1][0]) * bin[ans[i - 1] - 1] % MOD; } } long long sum = dp[26][0] + dp[26][1]; sum %= MOD; sum -= 1; sum += MOD; sum %= MOD; cout << sum << endl; } } //system("pause"); return 0; }