【模板】帶修莫隊

模板題

#include<bits/stdc++.h>
using namespace std;
int n,a[300005],pos[300005],m,sum[1000005],ans[2000005],t1,t2,a2[2000005][2],la[2000005],a3[1000005];
struct mzls
{
	int l,r,id,mo;
	bool operator<(const mzls &x)const
	{
		if(pos[l]!=pos[x.l])
			return pos[l]<pos[x.l];
		if(pos[r]!=pos[x.r])
			return pos[r]<pos[x.r];
		return mo<x.mo;
	}
}a1[2000005];
int main()
{
	scanf("%d%d",&n,&m);
	int d=pow(n,2.0/3);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a3[i]=a[i];
		pos[i]=(i-1)/d;
	}
	for(int i=1;i<=m;i++)
	{
		char c1[5];
		scanf("%s",c1);
		if(c1[0]=='Q')
		{
			t1++;
			a1[t1].id=t1;
			scanf("%d%d",&a1[t1].l,&a1[t1].r);
			a1[t1].mo=t2;
		}
		else
		{
			t2++;
			scanf("%d%d",&a2[t2][0],&a2[t2][1]);
			la[t2]=a3[a2[t2][0]];
			a3[a2[t2][0]]=a2[t2][1];
		}
	}
	sort(a1+1,a1+t1+1);
	int x=0,l1=1,r1=0,tt=0;
	for(int i=1;i<=t1;i++)
	{
		while(r1>a1[i].r)
		{
			sum[a[r1--]]--;
			if(sum[a[r1+1]]==0)
				x--;
		}
		while(r1<a1[i].r)
		{
			sum[a[++r1]]++;
			if(sum[a[r1]]==1)
				x++;
		}
		while(l1>a1[i].l)
		{
			sum[a[--l1]]++;
			if(sum[a[l1]]==1)
				x++;
		}
		while(l1<a1[i].l)
		{
			sum[a[l1++]]--;
			if(sum[a[l1-1]]==0)
				x--;
		}
		while(tt<a1[i].mo)
		{
			tt++;
			if(a2[tt][0]>=l1&&a2[tt][0]<=r1)
			{
				sum[a2[tt][1]]++;
				if(sum[a2[tt][1]]==1)
					x++;
				sum[a[a2[tt][0]]]--;
				if(sum[a[a2[tt][0]]]==0)
					x--;
			}
			a[a2[tt][0]]=a2[tt][1];
		}
		while(tt>a1[i].mo)
		{
			if(a2[tt][0]>=l1&&a2[tt][0]<=r1)
			{
				sum[a2[tt][1]]--;
				if(sum[a2[tt][1]]==0)
					x--;
				sum[la[tt]]++;
				if(sum[la[tt]]==1)
					x++;
			}
			a[a2[tt][0]]=la[tt];
			tt--;
		}
		ans[a1[i].id]=x;
	}
	for(int i=1;i<=t1;i++)
		printf("%d\n",ans[i]);//
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章