【带修莫队】【国家集训队】数颜色

/*
	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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值