题解:P12335 [eJOI 2024] 古迹漫步 / Old Orhei
[eJOI 2024] 古迹漫步 / Old Orhei
思路
可以发现
发现
时间复杂度为
代码
#include <bits/stdc++.h>
#define ls (u<<1)
#define rs ((u<<1)|1)
#define mid ((l+r)>>1)
using namespace std;
struct node{
int x,y;
}b[100005];
int n,m,T,Q,to[400005][55],a[100005];
void push_up(int u){
for(int i=1;i<=n;i++)
to[u][i]=to[rs][to[ls][i]];
}
void build(int u,int l,int r){
if(l==r){
for(int i=1;i<=n;i++) to[u][i]=i;
to[u][b[a[l]].x]=b[a[l]].y;
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
push_up(u);
}
void upd(int u,int l,int r,int x,int v){
if(l==r){
for(int i=1;i<=n;i++) to[u][i]=i;
to[u][b[v].x]=b[v].y;
return;
}
if(x<=mid) upd(ls,l,mid,x,v);
else upd(rs,mid+1,r,x,v);
push_up(u);
}
int qu(int u,int l,int r,int x,int y,int v){
if(x<=l&&r<=y) return to[u][v];
int res=v;
if(x<=mid) res=qu(ls,l,mid,x,y,res);
if(mid<y) res=qu(rs,mid+1,r,x,y,res);
return res;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>b[i].x>>b[i].y;
cin>>T;
for(int i=1;i<=T;i++)
cin>>a[i];
build(1,1,T);
cin>>Q;
while(Q--){
int op,l,r,x;
cin>>op;
if(op==1)
cin>>l>>r>>x,cout<<qu(1,1,T,l,r,x)<<endl;
else
cin>>l>>x,upd(1,1,T,l,x);
}
return 0;
}