#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
signed main(){
//~ cin.tie(0);
//~ ios::sync_with_stdio(0);
int n,m,q;cin>>n>>m>>q;
vector<vector<int>> al(n+1);
for(int i=0;i<n-1;i++){
int a,b;cin>>a>>b;
al[a].pb(b);
al[b].pb(a);
}
vector<vector<int>> up(n+1, vector<int>(20, 0));
vector<int> dep(n+1, 0);
auto dfs=[&](auto && dfs, int x, int p)->void{
for(auto it:al[x]){
if(it!=p){
dep[it]=dep[x]+1;
up[it][0]=x;
dfs(dfs, it, x);
}
}
};
dfs(dfs, 1, 0);
for(int j=1;j<20;j++){
for(int i=1;i<=n;i++){
up[i][j]=up[up[i][j-1]][j-1];
}
}
auto lca=[&](int a, int b)->int{
//~ printf("lca of %lld %lld\n", a,b);
if(dep[a] < dep[b])swap(a,b);
int raiseby=dep[a]-dep[b];
for(int i=0;i<20;i++) if((1<<i)&raiseby)a=up[a][i];
if(a==b)return a;
for(int i=19;i>=0;i--) if(up[a][i]!=up[b][i])a=up[a][i],b=up[b][i];
//~ printf("is %lld\n", up[a][0]);
return up[a][0];
};
vector<set<pair<int,int>>> pos(n+1);
vector<int> v(m+1);
for(int i=1;i<=m;i++){
cin>>v[i];
pos[v[i]].insert({i, i});
}
for(int i=1;i<m;i++){
pos[lca(v[i], v[i+1])].insert({i, i+1});
}
for(int qind=0;qind<q;qind++){
int t,a,b,c;cin>>t>>a>>b;
if(t==1){
if(a!=1){
c=lca(v[a], v[a-1]);
pos[c].erase({a-1, a});
}
if(a!=m){
c=lca(v[a], v[a+1]);
pos[c].erase({a, a+1});
}
pos[v[a]].erase({a, a});
v[a]=b;
if(a!=1){
c=lca(v[a], v[a-1]);
pos[c].insert({a-1, a});
}
if(a!=m){
c=lca(v[a], v[a+1]);
pos[c].insert({a, a+1});
}
pos[v[a]].insert({a, a});
}
if(t==2){
cin>>c;
auto it=pos[c].lower_bound({a, a});
if(it!=pos[c].end() and (*it).s <= b){
cout<<(*it).f<<" "<<(*it).s<<'\n';
}
else {
cout<<"-1 -1\n";
}
}
//~ for(int i=1;i<=n;i++){
//~ printf("%lld: ",i);
//~ for(auto [l, r]:pos[i]){
//~ printf("(%lld %lld) ",l,r);
//~ }
//~ cout<<endl;
//~ }
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |