奆佬求教,RE60pts
查看原帖
奆佬求教,RE60pts
183609
hhoppitreeMadeline楼主2020/8/27 11:13
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int res=0;
    char c;
    bool zf=0;
    while(((c=getchar())<'0'||c>'9')&&c!='-');
    if(c=='-')zf=1;
    else res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+c-'0';
    if(zf)return -res;
    return res;
}
struct op1{
	int pos,val;
}c[133334];
struct op2{
	int l,r,id,t;
}ask[133334];
int cr,askr;
int col[133334],cnt[1000005],bel[133334],ans[133334];
inline bool cmp(op2 x,op2 y){
	return (bel[x.l]^bel[y.l]?bel[x.l]<bel[y.l]:(bel[x.r]^bel[y.r]?bel[x.r]<bel[y.r]:x.t<y.t));
}
signed main(){
	int n=read(),m=read();
	for(register int i=1;i<=n;++i){
		col[i]=read();
	}
	for(register int i=1;i<=m;++i){
		char cc;
		while((cc=getchar())!='Q'&&cc!='R');
		if(cc=='Q'){
			ask[++askr].l=read(),ask[askr].r=read(),ask[askr].id=askr,ask[askr].t=cr;
		}
		else{
			c[++cr].pos=read(),c[cr].val=read();
		}
	}
	int size=exp((log(n)+log(cr))/3);
	for(register int i=1;i<=n;++i){
		bel[i]=(i-1)/size+1;
	}
	sort(ask+1,ask+askr+1,cmp);
	int l=1,r=0,t=0,nowans=0;
	for(register int i=1;i<=n;++i){
		while(l<ask[i].l)nowans-=!(--cnt[col[l++]]);
		while(l>ask[i].l)nowans+=!(cnt[col[--l]]++);
		while(r<ask[i].r)nowans+=!(cnt[col[++r]]++);
		while(r>ask[i].r)nowans-=!(--cnt[col[r--]]);
		while(t<ask[i].t){++t;
			if(l<=c[t].pos&&c[t].pos<=r)nowans+=!(cnt[c[t].val]++)-!(--cnt[col[c[t].pos]]);
			swap(col[c[t].pos],c[t].val);
		}
		while(t>ask[i].t){
			if(l<=c[t].pos&&c[t].pos<=r)nowans+=!(cnt[c[t].val]++)-!(--cnt[col[c[t].pos]]);
			swap(col[c[t].pos],c[t].val);
			--t;} 
		ans[ask[i].id]=nowans;
	}
	for(register int i=1;i<=askr;++i){
		printf("%d\n",ans[i]);
	}
	return 0;
}
2020/8/27 11:13
加载中...