又T又WA求助
查看原帖
又T又WA求助
130104
loris楼主2021/11/9 20:05
#include<bits/stdc++.h>
using namespace std;
const int MM=2000006;
int n,bs,a[MM],b[MM],num[MM],answer[MM],cnt,ans,l,r,t;
char ch;
struct que
{
	int l,r,t;
}q[MM];
struct update
{
	int p,x,t;
}u[MM];
void add(int p)
{
	if(!num[a[p]])ans++;
	num[a[p]]++;
}
void del(int p)
{
	if(num[a[p]]==1)ans--;
	num[a[p]]--;
}
void upd(int t)
{
	if(!u[t].p)
		return;
	if(u[t].p<=r&&u[t].p>=l)	
	{
		del(u[t].p);
		if(!num[u[t].x])ans++;
		num[u[t].x]++;
	}
} 
void und(int t)
{
	if(!u[t].p)
		return;
	if(u[t].p<=r&&u[t].p>=l)	
	{
		add(u[t].p);
		if(num[u[t].x]==1)ans--;
		num[u[t].x]--;
	}
}
bool cmp(que x,que y)
{
	if(b[x.l]==b[y.l])
		if(b[x.r]==b[y.r])
			return x.t<y.t;
		else
			return b[x.r]<b[y.r];
	else
		return b[x.l]<b[y.l];
}
int main()
{
	cin>>n>>t;
	bs=round(pow(n*t,0.333));
	for(int i=1;i<=n;i++)
		cin>>a[i],b[i]=i/bs;
	for(int i=1;i<=t;i++)
		answer[i]=-1;
	while(t--)
	{
		cin>>ch;
		if(ch=='Q')
			cin>>q[++cnt].l,cin>>q[cnt].r,q[cnt].t=cnt;
		else
			cin>>u[++cnt].p,cin>>u[cnt].x;
	} 
	sort(q+1,q+cnt+1,cmp);
	t=0;
	for(int i=1;i<=cnt;i++)
	{
		if(!q[i].t)continue;
		while(l<q[i].l) del(l++);
		while(l>q[i].l) add(--l);
		while(r<q[i].r) add(++r);
		while(r>q[i].r) del(r--);
		while(t<q[i].t) upd(++t);
		while(t>q[i].t) und(t--);
		answer[q[i].t]=ans;
	} 
	for(int i=1;i<=t;i++)
		if(answer[i]!=-1)
			cout<<answer[i]<<endl; 
	
	return 0;
}
2021/11/9 20:05
加载中...