萌新求就待修莫队
查看原帖
萌新求就待修莫队
248400
Otomachi_Una_楼主2021/10/5 15:23

RT,以一个关注作为回报,求求了...马蜂不好请见谅..

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=133338;
const int MR=1e6+5;
int n,m,sq;
int x[MAXN];
struct ask{
	int l,r,id,la;
}a[MAXN];
struct change{
	int p,c;
}g[MAXN];
int l=1,r=0,t=0,p=0;
int u,v;
int cnt[MR];
int ans[MAXN];
bool cmp(ask x,ask y){
	if(x.l/sq!=y.l/sq) return x.l<y.l;
	if(x.l/sq&1) return x.r>y.r;
	return x.r<y.r;
}
void add(int k){
	if(cnt[k]++==0) p++;
}
void del(int k){
	if(--cnt[k]==0) p--;
}
void cha (int k){
	if(g[k].c>=l&&g[k].c<=r)
		del(x[g[k].p]),
		add(g[k].c);
	swap(x[g[k].p],g[k].c);
}
int main(){
	cin>>n>>m;
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
		cin>>x[i];
	for(int i=1;i<=m;i++){
		char c;
		cin>>c;
		if(c=='Q'){
			u++;
			cin>>a[u].l>>a[u].r;
			a[u].id=u;
			a[u].la=v;
		}
		else{
			v++;
			cin>>g[v].p>>g[v].c;
		}
	}
	sort(a+1,a+u+1,cmp);
	for(int i=1;i<=u;i++){
		while(l>a[i].l) add(x[--l]);
		while(l<a[i].l) del(x[l++]);
		while(r<a[i].r) add(x[++r]);
		while(r>a[i].r) del(x[r--]);
		while(t>a[i].la) cha(t--);
		while(t<a[i].la) cha(++t);
		ans[a[i].id]=p;
	}
	for(int i=1;i<=u;i++)	
		cout<<ans[i]<<endl;
	return 0;
} 
2021/10/5 15:23
加载中...