[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;
}