照着第一篇题解写的,看起来和题解没啥区别啊
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=1e6+10;
int sz,res,a[N],c[M],ans[N];
struct Query{
int l,r,t,id;
bool operator <(const Query &x)const{
return l/sz==x.l/sz?r/sz==x.r/sz?t<x.t:r<x.r:l<x.r;
}
}qr[N];
struct Update{
int p,c;
}ud[N];
inline void add(int x){
res+=!c[x]++;
}
inline void del(int x){
res-=!--c[x];
}
inline void upd(int l,int r,int t){
if(l<=ud[t].p&&ud[t].p<=r){
del(a[ud[t].p]);
add(ud[t].c);
}
swap(a[ud[t].p],ud[t].c);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
sz=pow(n,2.0/3);
for(int i=1;i<=n;++i){
cin>>a[i];
}
int q=0,u=0;
char op;
while(m--){
cin>>op;
if(op=='Q'){
qr[++q].t=u,qr[q].id=q;
cin>>qr[q].l>>qr[q].r;
}else{
++u;
cin>>ud[u].p>>ud[u].c;
}
}
sort(qr+1,qr+q+1);
for(int i=1,l=1,r=0,t=0;i<=q;++i){
while(l<qr[i].l)del(a[l++]);
while(l>qr[i].l)add(a[--l]);
while(r<qr[i].r)add(a[++r]);
while(r>qr[i].r)del(a[r--]);
while(t<qr[i].t)upd(l,r,++t);
while(t>qr[i].t)upd(l,r,t--);
ans[qr[i].id]=res;
}
for(int i=1;i<=q;++i){
cout<<ans[i]<<'\n';
}
return 0;
}