[CF911G] Mass Change Queries

线段树合并裸题

#include <bits/stdc++.h>
const int N=2e5+5;

int tot,rt[101],ans[N];
struct Node {int ls,rs;} t[N*200];

void insert(int&x,int l,int r,int p) {
	if(!x) x=++tot; 
	if(l==r) return;
	int mid=(l+r)>>1;
	if(p<=mid) insert(t[x].ls,l,mid,p);
	else insert(t[x].rs,mid+1,r,p);
}
void merge(int&x,int&y,int l,int r) {
	if(!x) return;
	if(!y) {y=x; x=0; return;}
	if(l==r) return;
	int mid=(l+r)>>1;
	merge(t[x].ls,t[y].ls,l,mid);
	merge(t[x].rs,t[y].rs,mid+1,r);
	x=0;
}
void move(int&x,int&y,int l,int r,int L,int R) {
	if(!x) return;
	if(L<=l&&r<=R) return merge(x,y,l,r);
	if(!y) y=++tot;
	int mid=(l+r)>>1;
	if(L<=mid) move(t[x].ls,t[y].ls,l,mid,L,R);
	if(mid<R) move(t[x].rs,t[y].rs,mid+1,r,L,R);
}
void release(int x,int l,int r,int T) {
	if(!x) return;
	if(l==r) {ans[l]=T; return;}
	int mid=(l+r)>>1;
	release(t[x].ls,l,mid,T);
	release(t[x].rs,mid+1,r,T);
}

int main() {
	int n,Q;
	scanf("%d",&n);
	for(int x,i=1; i<=n; ++i) {
		scanf("%d",&x);
		insert(rt[x],1,n,i);
	}
	scanf("%d",&Q);
	for(int l,r,x,y; Q--; ) {
		scanf("%d%d%d%d",&l,&r,&x,&y);
		if(x!=y) // 注意被卡
			move(rt[x],rt[y],1,n,l,r);
	}
	for(int i=1; i<=100; ++i) release(rt[i],1,n,i);
	for(int i=1; i<=n; ++i) printf("%d ",ans[i]);
	return 0;
}
posted @ 2019-06-18 09:35  nosta  阅读(258)  评论(0编辑  收藏  举报