全Tqq求助
查看原帖
全Tqq求助
335094
Lucifero楼主2021/7/19 16:56
#include <bits/stdc++.h>
#define N 133333
#define KP 366
#define M 133333
#define K 1000000
using namespace std;
int bi[N+1];
class Query
{
public:
	int l,r,ord,id;
}qq[M+1];
bool operator<(Query L,Query R)
{
	if (bi[L.l]!=bi[R.l]) return bi[L.l]<bi[R.l];
	if (bi[L.r]!=bi[R.r]) return bi[L.r]<bi[R.r];
	return L.ord<R.ord;
}
class Modify
{
public:
	int x,c;
}mm[M+1];
int a[N+1],n,m,m1,m2,kp,tot;
int cnt[K+1],res[M+1];
void madd(int x)
{
	if (!cnt[x]) tot++;
	cnt[x]++;
}
void mdel(int x)
{
	cnt[x]--;
	if (!cnt[x]) tot--;
}
void mspend(int x1,int x2)
{
	if (mm[x2].x>=qq[x1].l && mm[x2].x<=qq[x1].r)
		mdel(a[mm[x2].x]),madd(mm[x2].c);
	swap(a[mm[x2].x],mm[x2].c);
}
void HeadMos(int l,int r,int ord)
{
	int i;
	for(i=1;i<=m1;i++)
	{
		while(ord<qq[i].ord) mspend(i,++ord);
		while(ord>qq[i].ord) mspend(i,ord--);
		while(r<qq[i].r) madd(a[++r]);
		while(r>qq[i].r) mdel(a[r--]);
		while(l<qq[i].l) mdel(a[l++]);
		while(l>qq[i].l) madd(a[--l]);
		res[qq[i].id]=tot;
	}
}
int main()
{
	//ÊýÑÕÉ«
	char opt;
	int x,y,i;
	scanf("%d",&n);
	kp=ceil(pow(n,2.0/3.0));
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		bi[i]=(i-1)/kp+1;
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		while(opt=getchar())
			if (opt=='Q' || opt=='R')
				break;
		scanf("%d%d",&x,&y);
		if (opt=='Q')
			qq[++m1]=(Query){x,y,m2,m1};
		else if (opt=='R')
			mm[++m2]=(Modify){x,y};
	}
	sort(qq+1,qq+m1+1);
	HeadMos(1,0,0);
	for(i=1;i<=m1;i++) printf("%d\n",res[i]);
}
2021/7/19 16:56
加载中...