只有20分的主席树,求助
  • 板块P3939 数颜色
  • 楼主anideahe
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/1/18 21:45
  • 上次更新2023/10/28 12:00:41
查看原帖
只有20分的主席树,求助
178259
anideahe楼主2022/1/18 21:45
#include<cstdio>
void swap(int &x,int &y){x^=y^=x^=y;}
const int N=3e5+1;
void read(int &x){
	char c=getchar();x=0;
	while(c< '0'||c> '9') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
void write(int x){
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void print(int x){
	write(x);
	puts("");
}
int n,m,tot;
int a[N],rt[N],t[N<<5],ls[N<<5],rs[N<<5];
void build(int x,int &k,int l,int r,int c){
	k=++tot;
	t[k]=t[x],ls[k]=ls[x],rs[k]=rs[x];
	if(l==r){t[k]++;return ;}
	int mid=(l+r)>>1;
	if(c<=mid) build(ls[x],ls[k],l,mid,c);
	if(c> mid) build(rs[x],rs[k],mid+1,r,c);
}
int query(int x,int k,int l,int r,int c){
	if(l==r){return t[k]-t[x];}
	int mid=(l+r)>>1;
	if(c<=mid) return query(ls[x],ls[k],l,mid,c);
	if(c> mid) return query(rs[x],rs[k],mid+1,r,c);
}
void change(int x,int l,int r,int c,int p){
	if(l==r){t[x]+=p;return ;}
	int mid=(l+r)>>1;
	if(c<=mid) change(ls[x],l,mid,c,p);
	if(c> mid) change(rs[x],mid+1,r,c,p);
}
int main(){
	read(n),read(m);
	for(int i=1;i<=n;i=-~i){
		read(a[i]);
		build(rt[i-1],rt[i],1,N,a[i]);
	}
	for(int i=1;i<=m;i=-~i){
		int opt,l,r,c,x;
		read(opt);
		if(opt==1){
			read(l),read(r),read(c);
			print(query(rt[l-1],rt[r],1,N,c));
		} 
		if(opt==2){
			read(x);
			change(rt[x],1,N,a[x],-1);
			change(rt[x],1,N,a[x+1],1);
			swap(a[x],a[x+1]);
		} 
	}
	return 0;
}
2022/1/18 21:45
加载中...