比赛 SYOI 专题 4:分块(根号杂烩) 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数颜色 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.145 s
代码语言 C++ 内存使用 10.90 MiB
提交时间 2024-04-17 17:25:04
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=133333+5;
const int M=1000000+5;
struct sdf{
	int id,l,r,t;
}q[N];
struct wer{
	int x,c;
}r[N];
int cntq=0,cntr=0;
int n,m,s;
int tot=0,num[M]={0};
int col[N],ans[N]={0};
bool cmp(sdf x,sdf y){
	if (x.l/s!=y.l/s)return x.l<y.l;
	if (x.r/s!=y.r/s)return x.r<y.r;
	return x.t<y.t;
}
void add(int x){
	if (num[x]==0)tot++;
	num[x]++;return ;
}
void del(int x){
	if (num[x]==1)tot--;
	num[x]--;return ;
}
void upd(int x,int y){
	if (q[x].l<=r[y].x&&r[y].x<=q[x].r){
		add(r[y].c);del(col[r[y].x]);
	}
	swap(r[y].c,col[r[y].x]);
	return ;
}
int main(){
	freopen ("nt2011_color.in","r",stdin);
	freopen ("nt2011_color.out","w",stdout);
	scanf("%d%d",&n,&m);s=pow(n,2.0/3);
	for (int i=1;i<=n;i++)scanf("%d",&col[i]);
	for (int i=1;i<=m;i++){
		char opt[5];int x,y;scanf("%s%d%d",opt,&x,&y);
		if (opt[0]=='Q'){cntq++;
			q[cntq]={cntq,x,y,cntr};
		}
		else{cntr++;
			r[cntr]={x,y};
		}
	}
	sort(q+1,q+cntq+1,cmp);
	int nowl=1,nowr=0,nowt=0;
	for (int i=1;i<=cntq;i++){
		while(nowl<q[i].l)del(col[nowl++]);
		while(nowl>q[i].l)add(col[--nowl]);
		while(nowr<q[i].r)add(col[++nowr]);
		while(nowr>q[i].r)del(col[nowr--]);
		while(nowt<q[i].t)upd(i,++nowt);
		while(nowt>q[i].t)upd(i,nowt--);
		ans[q[i].id]=tot;
	}
	for (int i=1;i<=cntq;i++)printf("%d\n",ans[i]);
	return 0;
}