不知道什么原因,全都RE了,数组开的够大了而且也测试了好多组数据也都有输出,可交上去就是0分QAQ。
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
int n,m,s,si[maxn],ctt[maxn],tq,tc,curl,curr,temp,now,ans[maxn];//ctt记录颜色数量,si记录颜色,tq/tc分别是询问数和修改数
typedef struct a{
int l,r,id,pre;//id是原标号,pre是他前面有几次修改操作
bool operator < (const a& o) const{
return l/s<o.l/s||(l/s==o.l/s&&r<o.r);
}
}per;
per ask[maxn];//询问
typedef struct b{
int pos,cou;
}node;
node change[maxn];//修改
int del(int num){
ctt[si[num]]--;
if(!ctt[si[num]]) temp--;
}
int add(int num){
ctt[si[num]]++;
if(ctt[si[num]]==1) temp++;
}
int work(int now,int i){
if(change[now].pos>=ask[i].l&&change[now].pos<=ask[i].r){
if(--ctt[si[change[now].pos]]==0) temp--;
if(++ctt[change[now].cou]==1) temp++;
}
swap(change[now].cou,si[change[now].pos]);
}//上面都是带修莫队板子
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>si[i];
char sign;
s=sqrt(n);//求块长
int l,r;
for(int i=1;i<=m;++i){
cin>>sign;
if(sign=='Q'){
++tq;
cin>>ask[tq].l>>ask[tq].r;
if(ask[tq].l>ask[tq].r) swap(ask[tq].l,ask[tq].r);
ask[tq].id=tq;
ask[tq].pre=tc;
}
else{
tc++;
cin>>change[tc].pos>>change[tc].cou;
}
}
sort(ask+1,ask+1+tq);
curl=1;
for(int i=1;i<=tq;++i){
int l=ask[i].l,r=ask[i].r;
while(curr<r) add(++curr);
while(curr>r) del(curr--);
while(curl<l) del(curl++);
while(curl>l) add(--curl);
while(now<ask[i].pre) work(++now,i);
while(now>ask[i].pre) work(--now,i);
ans[ask[i].id]=temp;//莫队板子
}
for(int i=1;i<=tq;++i) printf("%d\n",ans[i]);
return 0;
}