[國家集訓隊]數顏色
阿新 • • 發佈:2018-12-09
傳送門 帶修改的莫隊與普通的莫隊相比就是加入了一個時間指標,在排序時也要加入第三關鍵字。 還有就是塊的大小不再是了。
#include<bits/stdc++.h>
#define il inline
using namespace std;
const int N=50005;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
il int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=(x+(x<<2)<<1)+c-48;
return x*f;
}
il bool cread(){
char c=getchar();
for(;!isalpha(c);c=getchar());
return c=='Q';
}
char sr[1<<21],z[20];int C=-1,Z;
il void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
il void print(int x){
if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int n,m,k,q,s,a[N],b[N],bl[N],rc[N],rpre[N],rnew[N];
int t,cur,cnt[1000005],ans[N];
struct A{
int id,l,r,t;
}Q[N];
il bool cmp(A a,A b){return bl[a.l]==bl[b.l]?(bl[a.r]==bl[b.r]?((bl[a.r]&1)^(a.t<b.t)):((bl[a.l]&1)^(a.r<b.r))):a.l<b.l;}
il void ins(int u){if(cnt[a[u]]++==0) ++cur;}
il void del(int u){if(--cnt[a[u]]==0) --cur;}
int main(){
n=read(),q=read();
for(int i=1;i<=n;++i) a[i]=b[i]=read();
while(q--) cread()?(Q[++m].id=m,Q[m].l=read(),Q[m].r=read(),Q[m].t=k):(rc[++k]=read(),rpre[k]=b[rc[k]],rnew[k]=b[rc[k]]=read());
s=pow(1.0*n*(k+1),1.0/3);
for(int i=1;i<=n;++i) bl[i]=(i-1)/s+1;
sort(Q+1,Q+m+1,cmp);
for(int i=1,l=1,r=0;i<=m;++i){
while(l<Q[i].l) del(l++);
while(l>Q[i].l) ins(--l);
while(r<Q[i].r) ins(++r);
while(r>Q[i].r) del(r--);
while(t<Q[i].t){
++t;
if(l<=rc[t]&&rc[t]<=r) del(rc[t]);
a[rc[t]]=rnew[t];
if(l<=rc[t]&&rc[t]<=r) ins(rc[t]);
}
while(t>Q[i].t){
if(l<=rc[t]&&rc[t]<=r) del(rc[t]);
a[rc[t]]=rpre[t];
if(l<=rc[t]&&rc[t]<=r) ins(rc[t]);
--t;
}ans[Q[i].id]=cur;
}
for(int i=1;i<=m;++i) print(ans[i]);
Ot();return 0;
}