感觉做法假了
#include <bits/stdc++.h>
#define N 200001
using namespace std;
int n,q,l,r,x,y;
int len,cnt,tot;
int a[N],block[N];
list<int>::iterator t[N];
list<int> link[1001][101];
void build(){
for (int i=1;i<=n/len;i++){
++cnt;
for (int j=1;j<=len;j++){
int pos=(i-1)*len+j;
block[pos]=i;
link[i][a[pos]].push_back(pos);
}
}
++cnt;
for (int i=n/len*len+1;i<=n;i++){
block[i]=cnt;
link[cnt][a[i]].push_back(i);
}
}
void change(){
int L=block[l],R=block[r];
for (int i=L+1;i<R;i++){
link[i][y].splice(link[i][y].begin(),link[i][x]);
}
tot=0;
for (list<int>::iterator it=link[L][x].begin();it!=link[L][x].end();it++){
int tmp=(*it);
if (tmp>=l&&tmp<=r){
link[L][y].push_back(tmp);
t[++tot]=it;
}
}
while (tot)link[L][x].erase(t[tot--]);
for (list<int>::iterator it=link[R][x].begin();it!=link[R][x].end();it++){
int tmp=(*it);
if (tmp>=l&&tmp<=r){
link[R][y].push_back(tmp);
t[++tot]=it;
}
}
while (tot)link[R][x].erase(t[tot--]);
}
int main(){
freopen("data.txt","r",stdin);
cin>>n;
len=sqrt(n);
int mx=0;
for (int i=1;i<=n;i++){
cin>>a[i];
mx=max(mx,a[i]);
}
build();
cin>>q;
while (q--){
cin>>l>>r>>x>>y;
mx=max(mx,y);
change();
}
for (int i=1;i<=cnt;i++)
for (int j=1;j<=mx;j++)
for (auto k:link[i][j])
a[k]=j;
for (int i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}