rt,只有最后三个点AC,其他都RE
数组应该是开够了
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define in inline
typedef long long ll;
in ll max(ll x, ll y) {return x > y ? x : y;}
in ll min(ll x, ll y) {return x < y ? x : y;}
in void swap(int &x, int &y) {x ^= y ^= x ^= y;}
#define rei register int
#define rep(i, l, r) for(rei i = l, i##end = r; i <= i##end; ++i)
#define repd(i, r, l) for(rei i = r, i##end = l; i >= i##end; --i)
char inputbuf[1 << 22], *p1 = inputbuf, *p2 = inputbuf;
#define getchar() (p1 == p2 && (p2 = (p1 = inputbuf) + fread(inputbuf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
in int read() {
int res = 0; char ch = getchar(); bool f = true;
for(; ch < '0' || ch > '9'; ch = getchar())
if(ch == '-') f = false;
else if(ch == 'Q') return -1;
else if(ch == 'R') return -2;
for(; ch >= '0' && ch <= '9'; ch = getchar())
res = res * 10 + (ch ^ 48);
return f ? res : -res;
}
const int N = 233335;
int a[N], cnt[1100005], bl, bel[N], _ans, n, ans[N];//bel是每个位置所属的块
struct _Q_ {//查询
int l, r, k, q, i;
} q[N];
struct _M_ {//修改
int i, x;
} mdf[N];
in bool cmp(const _Q_ x, const _Q_ y) {
if(bel[x.l] ^ bel[y.l]) return x.l < y.l;
if(bel[x.r] ^ bel[y.r]) return x.r < y.r;
return x.q < y.q;
}
in void add(int i) {if(!cnt[a[i]]++) ++_ans;}
in void del(int i) {if(!--cnt[a[i]]) --_ans;}
in void modify(int k, int l, int r) {
int i = mdf[k].i;
if(l <= i && i <= r) add(mdf[k].x), del(a[i]);
swap(mdf[k].x, a[i]);
}
signed main() {
int l, r, kk, tot, tot2, tmpq, qq;//tmpq是离本次查询最近的修改的位置
l = r = kk = tot = tot2 = tmpq = 0;
n = read(); qq = read();
bl = pow(n, double(2) / 3);
rep(i, 1, n) a[i] = read();
for(; qq; --qq) {
if(~read()) {
tmpq = ++tot2;
mdf[tot2].i = read();
mdf[tot2].x = read();
}
else {
q[++tot].l = read();
q[tot].r = read();
q[tot].q = tmpq;
q[tot].i = tot;
}
}
rep(i, 1, n) bel[i] = (i - 1) / bl + 1;
sort(q + 1, q + tot + 1, cmp);
rep(i, 1, tot) {
while(l > q[i].l) add(--l);
while(r < q[i].r) add(++r);
while(l < q[i].l) del(l++);
while(r > q[i].r) del(r--);
while(kk < q[i].q) modify(++kk, l, r);
while(kk > q[i].q) modify(kk--, l, r);
ans[q[i].i] = _ans;
}
rep(i, 1, tot) printf("%d\n", ans[i]);
return 0;
}