代码如下
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
using ll = long long;
#define maxn 133333
#define maxk 400
ll n,m,len,k;
ll a[maxn],F[maxn];
ll L[maxk],R[maxk];
unordered_map<int,int> unmap[maxk];
bitset<1000001> bs[maxk];
void build(){
len=sqrt(n),k=(n+len-1)/len;
for(int i=1;i<=k;i++)L[i]=R[i]+1,R[i]=L[i]+len-1;
R[k]=n;
for(int i=1;i<=k;i++)
for(int j=L[i];j<=R[i];j++){
F[j]=i,bs[i][a[j]]=1,unmap[i][a[j]]++;
}
}
void update(int x,int y){
bs[F[x]][y]=1;
if(--unmap[F[x]][a[x]])bs[F[x]][a[x]]=0;
a[x]=y;
return;
}
bitset<1000001> query(int l,int r){
bitset<1000001> res;
if(F[l]==F[r]){
for(int i=l;i<=r;i++)res[a[i]]=1;
return res;
}
res=query(l,R[F[l]])|query(L[F[r]],r);
for(int i=F[l]+1;i<F[r];i++){
res=res|bs[i];
}
return res;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
build();
for(int i=1,x,y;i<=m;++i){
char opt;
cin>>opt;
if(opt=='Q'){
cin>>x>>y;
cout<<query(x,y).count()<<'\n';
}else{
cin>>x>>y;
update(x,y);
}
}
return 0;
}
unordered_map是用来方便判断删去某个数之后区间是否还有这个数,如果不用unordered_map还会TLE#8
玄关,明天回