题目链接:Codeforces - Mass Change Queries
比较巧妙的线段树,利用线段树一直下推lazy。
每个节点100个lazy,分别表示 lazy[i]=x,表示i会变成x。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int a[N],n,q;
int lazy[N<<2][110],sum[N<<2];
void build(int p,int l,int r){
for(int i=1;i<=100;i++) lazy[p][i]=i;
if(l==r){scanf("%d",&sum[p]); return ;}
int mid=l+r>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
inline void push_down(int p){
for(int k=1;k<=100;k++){
lazy[p<<1][k]=lazy[p][lazy[p<<1][k]];
lazy[p<<1|1][k]=lazy[p][lazy[p<<1|1][k]];
}
for(int k=1;k<=100;k++) lazy[p][k]=k;
}
void change(int p,int l,int r,int ql,int qr,int x,int y){
if(l==ql&&r==qr){for(int i=1;i<=100;i++) if(lazy[p][i]==x) lazy[p][i]=y; return ;}
int mid=l+r>>1; push_down(p);
if(qr<=mid) change(p<<1,l,mid,ql,qr,x,y);
else if(ql>mid) change(p<<1|1,mid+1,r,ql,qr,x,y);
else change(p<<1,l,mid,ql,mid,x,y),change(p<<1|1,mid+1,r,mid+1,qr,x,y);
}
void ask(int p,int l,int r){
if(l==r){printf("%d ",lazy[p][sum[p]]); return ;}
int mid=l+r>>1; push_down(p);
ask(p<<1,l,mid),ask(p<<1|1,mid+1,r);
}
signed main(){
cin>>n; build(1,1,n); cin>>q;
for(int i=1,l,r,x,y;i<=q;i++)
scanf("%d %d %d %d",&l,&r,&x,&y),change(1,1,n,l,r,x,y);
ask(1,1,n);
return 0;
}