#include <bits/stdc++.h>
#define int long long
#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)
using namespace std;
struct tree {
int t[4 * 50005], mu[4 * 50005], ad[4 * 50005];
tree() {
memset(t, 0, sizeof(t));
memset(mu, 0, sizeof(mu));
memset(ad, 0, sizeof(ad));
}
void push_up (int p) {
t[p] = t[ls(p)] + t[rs(p)];
}
void build (int l, int r, int p) {
mu[p] = 1;
if (l == r) return;
int mid = (l + r) >> 1;
build (l, mid, ls(p));
build (mid + 1, r, rs(p));
return;
}
void lazy_tag (int p, int l, int r, int mul, int add) {
t[p] *= mul;
mu[p] *= mul;
ad[p] *= mul;
t[p] += (r - l + 1) * add;
ad[p] += add;
return;
}
void push_down (int p, int l, int r) {
int mid = (l + r) >> 1;
lazy_tag (ls(p), l, mid, mu[p], ad[p]);
lazy_tag (rs(p), mid + 1, r, mu[p], ad[p]);
mu[p] = 1;
ad[p] = 0;
return;
}
void update (int L, int R, int l, int r, int p, int mul, int add) {
if (l <= L && R <= r) {
lazy_tag (p, l, r, mul, add);
return;
}
push_down(p, L, R);
int mid = (L + R) >> 1;
if (l <= mid) update (L, mid, l, r, ls(p), mul, add);
if (r > mid) update (mid + 1, R, l, r, rs(p), mul, add);
push_up(p);
return;
}
int query (int L, int R, int l, int r, int p) {
if (l <= L && R <= r) {
return t[p];
}
push_down(p, L, R);
int mid = (L + R) >> 1, sum = 0;
if (l <= mid) sum += query (L, mid, l, r, ls(p));
if (r > mid) sum += query (mid + 1, R, l, r, rs(p));
return sum;
}
};
tree t[27];
int n, m;
char s[100005];
signed main() {
scanf("%lld%lld%s", &n, &m, s + 1);
for (int i = 0; i < 26; ++ i) t[i].build(1, n, 1);
for (int i = 1; i <= n; ++ i) t[s[i] - 'A'].update(1, n, i, i, 1, 1, 1);
while (m -- ) {
int op, x, y;
scanf("%lld%lld%lld", &op, &x, &y);
if (op == 1) {
char k[2];
scanf("%s", k);
printf("%lld\n", t[k[0] - 'A'].query(1, n, x, y, 1));
} else if (op == 2) {
char k[2];
scanf("%s", k);
for (int i = 0; i < 26; ++ i) t[i].update(1, n, x, y, 1, 0, 0);
t[k[0] - 'A'].update(1, n, x, y, 1, 1, 1);
} else {
int cnt[30];
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < 26; ++ i) cnt[i] += t[i].query(1, n, x, y, 1);
for (int i = 0; i < 26; ++ i) t[i].update(1, n, x, y, 1, 0, 0);
for (int i = 0; i < 26; ++ i) {
t[i].update(1, n, x, x + cnt[i] - 1, 1, 1, 1);
x += cnt[i];
}
}
}
return 0;
}
全紫了,求助大佬