MnZn 第一次写带修莫队,求调。
#include<bits/stdc++.h>
using namespace std;
int bk;
char optype(){
char c=getchar();
while(c!='R'&&c!='Q') c=getchar();
return c;
}
struct Operation{
int l,r,t,id;
}op[133335]; int optot;
struct Update{
int x,y;
}u[133335]; int updtot;
bool cmp(Operation a,Operation b){
if(a.l/bk==b.l/bk)
if(a.r/bk==b.r/bk) return a.t<b.t;
else return a.r<b.r;
else return a.l<b.l;
}
int ans=0;
int a[133335];
int cnt[1500010];
void addval(int x){
if(cnt[a[x]]==0) ans++;
cnt[a[x]]++;
}
void delval(int x){
cnt[a[x]]--;
if(cnt[a[x]]==0) ans--;
}
void updval(int oper){
delval(a[u[oper].x]),addval(u[oper].y);
swap(a[u[oper].x],u[oper].y);
}
int nowl,nowr,nowt;
int anslis[133335];
int n,m;
int main(){
scanf("%d%d",&n,&m);
bk=pow(n,2.0/3)+1e-9;
nowl=1; nowr=n; nowt=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
addval(i);
}
for(int i=1;i<=m;i++){
if(optype()=='Q') optot++,op[optot].id=optot,op[optot].t=updtot,scanf("%d%d",&op[optot].l,&op[optot].r);
else updtot++,scanf("%d%d",&u[updtot].x,&u[updtot].y);
}
sort(op+1,op+optot+1,cmp);
for(int i=1;i<=optot;i++){
// printf("%d %d %d\n",op[i].l,op[i].r,op[i].t);
while(nowl<op[i].l) delval(nowl++);
while(nowl>op[i].l) addval(--nowl);
while(nowr<op[i].r) addval(++nowr);
while(nowr>op[i].r) delval(nowr--);
while(nowt<op[i].t) updval(++nowt);
while(nowt>op[i].t) updval(nowt--);
// printf("%d %d %d\n",nowl,nowr,nowt);
anslis[op[i].id]=ans;
}
for(int i=1;i<=optot;i++) printf("%d\n",anslis[i]);
}