带修莫队卡常 萌新悬关
查看原帖
带修莫队卡常 萌新悬关
352426
就决定是你辣楼主2023/3/19 19:07

rt,76pts TLE

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();};
	while(ch<='9'&&ch>='0'){x=x*10+ch-48,ch=getchar();};
	return x*f;
}
int a[maxn];
struct node{
	int l,r,i,t;
}d[maxn];
node g[maxn];
int sum;
int top,tot;
int gi;
bool cmp(node x,node y){
	if(x.l/gi!=y.l/gi)return  x.l<y.l;
	else if(x.r/gi!=y.r/gi) return x.r<y.r;
	else if(x.r/gi&1) return x.t<y.t;
	else return x.t>y.t;
}
int t[maxn];
void  add(int x){
	t[a[x]]++;
	if(1==t[a[x]])sum++;
}
void del(int x){
	t[a[x]]--;
	if(!t[a[x]])sum--;
}
void mod(int ti,int i){
	int x=g[ti].l;
	if(x<=d[i].r&&x>=d[i].l){
		if(--t[a[x]]==0)sum--;
		if(++t[g[ti].r]==1)sum++;
	}
	swap(g[ti].r,a[x]);
}
int ans[maxn];
int main(){
	int n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=m;i++){
		char ch;
		cin>>ch;
		if(ch=='R'){
			int x=read(),c=read();
			g[++top]={x,c};
		}
		else {
			int l=read(),r=read();
			d[++tot]={l,r,tot,top};
		}
	}
	gi=sqrt(n);
	sort(d+1,d+tot+1,cmp);
	for(int i=1,l=1,r=0,ti=0;i<=tot;i++){
		while(l>d[i].l)add(--l);
		while(r<d[i].r)add(++r);
		while(l<d[i].l)del(l++);
		while(r>d[i].r)del(r--);
		while(ti<d[i].t)mod(++ti,i);
		while(ti>d[i].t)mod(ti--,i);
		ans[d[i].i]=sum;
	}
	for(int i=1;i<=tot;i++)cout<<ans[i]<<endl;
}
2023/3/19 19:07
加载中...