WA+RE+TLE真的好折磨aaaa
https://www.luogu.com.cn/record/86765212
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e6+5,M=1e6+5;
int pos[N];
struct ask{
int l,r;
int pre;
int id;
int ans;
}a[N];
bool cmp_section(const ask& a,const ask& b){
if(pos[a.l]!=pos[b.l]) return pos[a.l]<pos[b.l];
if(pos[a.r]!=pos[b.r]) return pos[a.r]<pos[b.r];
return a.pre<b.pre;
}
bool cmp_id(const ask& a,const ask& b){
return a.id<b.id;
}
struct change{
int p,col;
int id;
}b[N];
int al,bl;
int n,m;
int v[N];
int cnt[M];
int ans;
int l=1,r=0;
void add(int k){
if(!cnt[v[k]]) ans++;
cnt[v[k]]++;
}
void del(int k){
cnt[v[k]]--;
if(!cnt[v[k]]) ans--;
}
void updata(int k,int add){
ans-=cnt[v[k]]>0;
cnt[v[k]]+=add;
ans+=cnt[v[k]]>0;
}
void change(int ql,int qr,int j){
int k=b[j].p,&col=b[j].col;
if(ql<=k&&k<=qr){
ans-=!--cnt[v[k]];
ans+=!cnt[col]++;
}
swap(v[k],col);
}
void solve(){
int j=0;
for(int i=1;i<=al;i++){
int ql=a[i].l,qr=a[i].r;
for(;l>ql;l--) add(l-1);
for(;l<ql;l++) del(l);
for(;r<qr;r++) add(r+1);
for(;r>qr;r--) del(r);
while(a[i].id>b[j].id) change(ql,qr,++j);
while(a[i].id<b[j].id) change(ql,qr,j--);
a[i].ans=ans;
}
}
int main() {
scanf("%d%d",&n,&m);
// int block=sqrt(n);
int block=pow(n,2.0/3.0);
for(int i=1;i<=n;i++)
pos[i]=(i-1)/block+1;
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
for(int i=1;i<=m;i++){
scanf("\n");
if(getchar()=='R'){
bl++;
scanf("%d%d",&b[bl].p,&b[bl].col);
b[bl].id=i;
}
else{
al++;
scanf("%d%d",&a[al].l,&a[al].r);
a[al].id=i;
a[al].pre=bl;
}
}
sort(a+1,a+1+al,cmp_section);
solve();
sort(a+1,a+1+al,cmp_id);
for(int i=1;i<=al;i++)
printf("%d\n",a[i].ans);
}