记录编号 297997 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]数颜色 最终得分 100
用户昵称 GravatarMarvolo 是否通过 通过
代码语言 C++ 运行时间 0.462 s
提交时间 2016-08-19 19:56:27 内存使用 17.90 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;

int i,n,m,cn=0,cnt=0,ans=0,x,y,block;
int s[1000010]={0},c[10010],b[10010],last[10010];
int Ans[10010];
bool v[10010];
char k[500];
struct zht{
	int l,r,id,n;
}q[10010];
struct Zht{
	int pos,c,p;
}d[10010];

bool cmp(zht A,zht B){
	if (b[A.l]==b[B.l]) return A.r<B.r;	else return A.l<B.l;
}

inline void update(int x){
	if (v[x]){
		if (!--s[c[x]])	ans--;
	}	else {
		if (++s[c[x]]==1)	ans++;
	}
	v[x]^=1;
	return;
}

inline void Change(int x,int y){
	if (v[x]){
		update(x);	c[x]=y;	update(x);
	}	else c[x]=y;
	return;
}

inline void Solve(){
	int i=0,j=0,l=1,r=1;
	update(l);
	for (i=1;i<=cn;i++){
		for (j=q[i-1].n+1;j<=q[i].n;j++)
		Change(d[j].pos,d[j].c);
        for (j=q[i-1].n;j>q[i].n;j--)
        Change(d[j].pos,d[j].p);
        while (l<q[i].l)  update(l++);
        while (l>q[i].l)  update(--l);
        while (r<q[i].r)  update(++r);
        while (r>q[i].r)  update(r--);
		Ans[q[i].id]=ans;
	}
	return;
}

int main(){
	freopen("nt2011_color.in","r",stdin);
	freopen("nt2011_color.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++){
		scanf("%d",&c[i]);	last[i]=c[i];
	}
	for (i=1;i<=m;i++){
		scanf("%s",&k);	scanf("%d%d",&x,&y);
		if (k[0]=='Q')	{
			q[++cn].l=x;	q[cn].r=y;	q[cn].id=cn;	q[cn].n=cnt;
		}	else {
			d[++cnt].pos=x;	d[cnt].c=y;	d[cnt].p=last[x];
			last[x]=y;
		}
	}
	block=sqrt(n);
	for (i=1;i<=n;i++)	b[i]=(i-1)/block+1;
	sort(q+1,q+1+cn,cmp);
	Solve();
	for (i=1;i<=cn;i++)	printf("%d\n",Ans[i]);
	return 0;
}