【模板】带修莫队

模板题

#include
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]a1[i].r)
		{
			sum[a[r1--]]--;
			if(sum[a[r1+1]]==0)
				x--;
		}
		while(r1a1[i].l)
		{
			sum[a[--l1]]++;
			if(sum[a[l1]]==1)
				x++;
		}
		while(l1=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]);//
}

 

你可能感兴趣的:(算法模板)