/*
Luogu P1903
数颜色
by sbn
2018-4-25
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAXN=1e7+10;
#define For(a,b,c) for (int (a)=(b);(a)<(c);(a)++)
int n,m,unit;
int col[MAXN],Be[MAXN],now[MAXN];
struct Ask{
int l,r; //查询区间
int Tim; //查询时间
int id; //查询是第几个
int res; //答案
Ask(){}
Ask(int nl,int nr,int nTim,int nid){
l=nl;r=nr;Tim=nTim;id=nid;
}
} q[MAXN];
struct Change{
int pos; //第几个画笔
int New; //改成什么颜色
int Old; //原来什么颜色
Change(){}
Change(int npos,int nNew,int nOld){
pos=npos;New=nNew;Old=nOld;
}
} c[MAXN];
int t,Time;
bool CMP(Ask x,Ask y){
return Be[x.l]==Be[y.l]?(Be[x.r]==Be[y.r]?x.Tim<y.Tim:x.r<y.r):x.l<y.l;
}
int num[MAXN],T,ans,l,r;
inline void reverse(int x,int d){
num[x]+=d;
if(d>0) ans+=num[x]==1;
else ans-=num[x]==0;
}
inline void change(int x,int d){
if (l<=x&&x<=r){
reverse(d,1);
reverse(col[x],-1);
}
col[x]=d;
}
bool cmp(Ask x,Ask y){
return x.id<y.id;
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cin>>n>>m;
unit=pow(n,0.666666666);
For(i,0,n){
scanf("%d",col+i+1);
Be[i]=i/unit+1;
now[i+1]=col[i+1];
}
For(i,0,m){
char sign;int a,b;
cin>>sign>>a>>b;
if (sign=='Q') q[++t]=Ask(a,b,Time,t);
if (sign=='R') c[++Time]=Change(a,b,now[a]),now[a]=b;
}
sort(q+1,q+1+t,CMP);
For(i,1,t+1){
while (T<q[i].Tim) change(c[T+1].pos,c[T+1].New),T++;
while (T>q[i].Tim) change(c[T].pos,c[T].Old),T--;
while (l<q[i].l) reverse(col[l],-1),l++;
while (l>q[i].l) reverse(col[l-1],1),l--;
while (r>q[i].r) reverse(col[r],-1),r--;
while (r<q[i].r) reverse(col[r+1],1),r++;
q[i].res=ans;
}
sort(q+1,q+1+t,cmp);
For(i,0,t) cout<<q[i+1].res<<endl;
return 0;
}
【带修莫队】【国家集训队】数颜色
最新推荐文章于 2023-11-07 15:32:09 发布