蒟蒻胡搞牌线段树求调
  • 板块P3939 数颜色
  • 楼主Igunareo
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/4/11 17:05
  • 上次更新2024/4/11 19:28:03
查看原帖
蒟蒻胡搞牌线段树求调
841638
Igunareo楼主2024/4/11 17:05
#include<bits/stdc++.h>
using namespace std;
int x[300005];
int root[300005];
struct edge{
	int l,r,val;
}y[10000000];
int top=0;
void up(int now,int had,int l,int r,int a,int p){
	if(l==r&&l==a){
		y[now].val=p;
		return;
	}
	int mid=(l+r)/2;
	if(a<=mid){
		y[now].l=++top;
		y[now].r=y[had].r;
		up(y[now].l,y[had].l,l,mid,a,p);
	}
	else{
		y[now].l=y[had].l;
		y[now].r=++top;
		up(y[now].r,y[had].r,mid+1,r,a,p);
	}
	y[now].val=y[y[now].l].val+y[y[now].r].val;
	return;
}
int down(int now,int l,int r,int fl,int fr){
	if(now==0)return 0;
	if(l==fl&&r==fr)return y[now].val;
	int mid=(l+r)/2;
	if(fr<=mid)return down(y[now].l,1,mid,fl,fr);
	else if(fl>mid)return down(y[now].r,mid+1,r,fl,fr);
	else return down(y[now].l,1,mid,fl,mid)+down(y[now].r,mid+1,r,mid+1,fr);
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x[i]);
		int rt=root[x[i]];
		root[x[i]]=++top;
		up(root[x[i]],rt,1,n,i,1);
	}
	while(m--){
		int kind;
		scanf("%d",&kind);
		if(kind==1){
			int l,r,colour;
			scanf("%d%d%d",&l,&r,&colour);
			printf("%d\n",down(root[colour],1,n,l,r));
		}
		else{
			int a;
			scanf("%d",&a);
			int ra=++top;
			up(ra,root[x[a+1]],1,n,a,1);
			root[x[a+1]]=ra;
			int rb=++top;
			up(rb,root[x[a]],1,n,a+1,1);
			root[x[a]]=rb;
			ra=++top;
			up(ra,root[x[a]],1,n,a,0);
			root[x[a+1]]=ra;
			rb=++top;
			up(rb,root[x[a+1]],1,n,a+1,0);
			root[x[a]]=rb;
			swap(x[a],x[a+1]);
		}
	}
	return 0;
} 
2024/4/11 17:05
加载中...