#1~#6wa,#7~#11tle,#12,13ac求助
查看原帖
#1~#6wa,#7~#11tle,#12,13ac求助
169594
Heart_Of_Iron_4楼主2024/10/8 20:54
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
#define endl "\n"
int cnt[1001000],a[1001000],ans,print[1001000],qlen,m,n,l,r,t,pre[1001000],bl,br;
int t2,t3;
bool b[1001000];
struct xy
{
	int x,y,z;//l r t
}ask[1001000],cg[1001000];
char t1;
il bool cmp(xy qwe,xy wer)
{
	if(qwe.x/bl!=wer.x/bl)return qwe.x/bl<wer.x/bl;
	else if(qwe.y/br!=wer.y/br)return qwe.y/br<wer.y/br;
	else return qwe.z<wer.z;
}
il void del(int k)
{
	cnt[k]--;
	if(cnt[k]==0)ans--;
}
il void add(int k)
{
	cnt[k]++;
	if(cnt[k]==1)ans++;
}
il void movel(int k)
{
	if(l<=k)
	{
		for(int i=l;i<k;++i)
		{
			del(a[i]);
		}
		l=k;
	}
	else
	{
		for(int i=k;i<l;++i)
		{
			add(a[i]);
		}
		l=k;
	}
}
il void mover(int k)
{
	if(r<=k)
	{
		for(int i=r+1;i<=k;++i)
		{
			add(a[i]);
		}
		r=k;
	}
	else
	{
		for(int i=k+1;i<=r;++i)
		{
			del(a[i]);
		}
		r=k;
	}
}
il void movet(int k)
{
	
	if(k>=t)
	{
		for(int i=t+1;i<=k;++i)
		{
			if(cg[i].x!=-1)
			{
				if(l<=cg[i].x&&cg[i].x<=r)
				{
					del(a[cg[i].x]);
					add(cg[i].y);
				}
				a[cg[i].x]=cg[i].y;
			}
		}
		t=k;
	}
	else
	{
		for(int i=k;i<t;++i)
		{
			if(cg[i].x!=-1)
			{
				if(l<=cg[i].x&&cg[i].x<=r)
				{
					add(a[cg[i].x]);
					del(cg[i].y);
				}
				a[cg[i].x]=pre[i];
			}
		}
		t=k;
	}
}
il void getpre()
{
	for(t=1;t<=n;++t)
	{
		if(cg[t].x!=-1)
		{
			pre[t]=a[cg[t].x];
			a[cg[t].x]=cg[t].y;
		}
	}
	for(t=n;t>=1;--t)
	{
		if(cg[t].x!=-1)
		{
			a[cg[t].x]=pre[t];
		}
	}
	t=0;
}
signed main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	bl=br=(int)(1.0*n/sqrt(m));
//	cout<<bl<<endl;
	qlen=0;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i];
		//cnt[a[i]]++;
	}
	for(int i=1;i<=m;++i)
	{
		cin>>t1>>t2>>t3;
		//	cout<<t1<<" "<<t2<<" "<<t3<<endl;
		if(t1=='R')
		{
			cg[i].x=t2;
			cg[i].y=t3;
		}
		else if(t1=='Q')
		{
			cg[i].x=-1;
			ask[++qlen].x=t2;
			ask[qlen].y=t3;
			ask[qlen].z=i;
			b[i]=1;
		}
	}
	sort(ask+1,ask+1+qlen,cmp);
	/*	cout<<qlen<<endl;
	for(int i=1;i<=qlen;++i)
{
	cout<<ask[i].x<<" "<<ask[i].y<<" "<<ask[i].z<<endl;
	}*/
	getpre();
	for(int i=1;i<=qlen;++i)
	{
		movel(ask[i].x);
		mover(ask[i].y);
		movet(ask[i].z);
		print[ask[i].z]=ans;
	}
	for(int i=1;i<=m;++i)
	{
		if(b[i])
		{
			cout<<print[i]<<endl;
		}
	}
	return 0;
}
2024/10/8 20:54
加载中...