RT,和题解狂拍一千组没出错,人麻了
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200005, maxb = 325;
int n, m, block, t;
int a[maxn];
int st[maxb], ed[maxb], pos[maxn];
short f[maxb][maxn << 1];
struct node {int p, x, y, k;} d[maxn];
int ind[maxn << 1], cnt;
void discrete() {
for (int i = 1; i <= n; i++) ind[++cnt] = a[i];
for (int i = 1; i <= m; i++)
if (d[i].p == 2) ind[++cnt] = d[i].k;
sort(ind + 1, ind + 1 + cnt);
int len = unique(ind + 1, ind + 1 + cnt) - ind - 1;
for (int i = 1; i <= n; i++) a[i] = lower_bound(ind + 1, ind + 1 + len, a[i]) - ind;
for (int i = 1; i <= m; i++)
if (d[i].p == 2) d[i].k = lower_bound(ind + 1, ind + 1 + len, d[i].k) - ind;
}
void init() {
block = sqrt(n); t = ceil(n * 1. / block);
for (int i = 1; i <= t; i++) {
st[i] = (i - 1) * block + 1; ed[i] = min(i * block, n);
for (int j = st[i]; j <= ed[i]; j++) pos[j] = i;
}
for (int i = 1; i <= n; i++) f[pos[i]][a[i]]++;
}
void update(int x, int y) {
int p = pos[x];
f[p][a[x]]--; f[p][y]++;
a[x] = y;
}
int query(int x, int y, int k) {
int p = pos[x], q = pos[y], ans = 0;
if (p == q) {
for (int i = x; i <= y; i++) ans += (a[i] == k);
return ans;
}
for (int i = p + 1; i <= q - 1; i++) ans += f[i][k];
for (int i = x; i <= ed[p]; i++) ans += (a[i] == k);
for (int i = st[q]; i <= y; i++) ans += (a[i] == k);
return ans;
}
int main() {
freopen("P2464.in", "r", stdin);
freopen("P2464.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= m; i++) {
char c; int x, y, k; cin >> c; scanf("%d%d", &x, &y);
if (c == 'C') d[i] = (node){1, x, y, 0};
else {scanf("%d", &k); d[i] = (node){2, x, y, k};}
}
discrete(); init();
for (int i = 1; i <= m; i++)
if (d[i].p == 1) update(d[i].x, d[i].y);
else printf("%d\n", query(d[i].x, d[i].y, d[i].k));
return 0;
}