rt,调了一天了,模板题还是40分,问题点好像在修改
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define int long long
#define N 140000
#define M 1100000
int n,m,a[M],ans[M],cnt[M],len,now;
char op[M];
struct node{
int l,r,id,a,x,uid;
}v[M];
int area(int x){
return x/len;
}
int cmp(node x,node y){
if(area(x.l)!=area(y.l)){
return area(x.l)<area(y.l);
}
return x.r<y.r;
}
void add(int x){
if(cnt[x]==0){
now++;
}
cnt[x]++;
return ;
}
void del(int x){
if(cnt[x]==1){
now--;
}
cnt[x]--;
return ;
}
signed main(){
cin.tie(0);
cout.tie(0);
cin>>n>>m;
len=pow(n,0.6666);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>op[i];
if(op[i]=='Q'){
cin>>v[i].l>>v[i].r;
}
else{
cin>>v[i].a>>v[i].x;
v[i].l=-1;
}
v[i].id=v[i-1].id;
if(v[i].l==-1){
v[i].id++;
}
v[i].uid=i;
}
sort(v+1,v+m+1,cmp);
int l=1,r=0,maxx=0,pre=0;
for(int i=1;i<=m;i++){
if(v[i].l==-1){
maxx=i;
continue;
}
while(r<v[i].r){
r++;
add(a[r]);
}
while(l>v[i].l){
l--;
add(a[l]);
}
while(r>v[i].r){
del(a[r]);
r--;
}
while(l<v[i].l){
del(a[l]);
l++;
}
while(pre<v[i].id){
pre++;
if(l<=v[pre].a&&v[pre].a<=r){
del(a[v[pre].a]);
add(v[pre].x);
}
swap(a[v[pre].a],v[pre].x);
}
while(pre>v[i].id){
if(l<=v[pre].a&&v[pre].a<=r){
del(a[v[pre].a]);
add(v[pre].x);
}
swap(a[v[pre].a],v[pre].x);
pre--;
}
ans[v[i].uid]=now;
}
for(int i=1;i<=m;i++){
if(op[i]=='R'){
continue;
}
cout<<ans[i]<<endl;
}
return 0;
}