#include <bits/stdc++.h>
using namespace std;
#define SPEED \
ios_base::sync_with_stdio(0); \
cin.tie(NULL); \
cout.tie(NULL);
#define pb push_back
#define ins insert
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define intt long long
const intt mod = 1e9 + 7;
const intt base = 31;
const intt inf = 1e18;
const intt mxN = 2e6 + 5;
const intt L = 21;
vector<vector<intt>> graph, up;
vector<intt> in(mxN), out(mxN), a(mxN);
intt timer, n, k, q;
void dfs(intt node, intt parent) {
in[node] = timer++;
up[0][node] = parent;
for(intt i = 1; i <= L; i++) {
up[i][node] = up[i-1][up[i-1][node]];
}
for(auto u : graph[node]) {
if(u != parent) {
dfs(u, node);
}
}
out[node] = timer++;
}
bool isata(intt a, intt b) {
return in[a] <= in[b] && out[a] >= out[b];
}
intt lca(intt a, intt b) {
if(isata(a, b)) return a;
if(isata(b, a)) return b;
for(intt i = L - 1; i >= 0; i--) {
if(!isata(up[i][a], b)) {
a = up[i][a];
}
}
return up[0][a];
}
void solve() {
cin >> n >> k >> q;
graph.assign(n + 1, vector<intt>());
up.assign(L + 1, vector<intt>(n + 5, 0));
for(intt i = 1; i <= n - 1; i++) {
intt a, b;
cin >> a >> b;
graph[a].pb(b);
graph[b].pb(a);
}
dfs(1, 1);
set<intt> pos[n + 5], pos2[n + 5];
for(intt i = 1; i <= k; i++) {
cin >> a[i];
pos2[a[i]].insert(i);
}
vector<intt> ls(n + 5, 0);
for(intt i = 1; i <= k - 1; i++) {
intt l = lca(a[i], a[i + 1]);
pos[l].insert(i);
ls[i] = l;
}
while(q--) {
intt t;
cin >> t;
if(t == 1) {
intt idx, v;
cin >> idx >> v;
pos2[a[idx]].erase(idx);
a[idx] = v;
pos2[a[idx]].insert(idx);
if (idx != 1) {
intt pl = ls[idx - 1], nl = lca(a[idx - 1], a[idx]);
pos[pl].erase(idx - 1);
ls[idx - 1] = nl;
pos[nl].insert(idx - 1);
}
if (idx != k) {
intt pl = ls[idx], nl = lca(a[idx], a[idx + 1]);
pos[pl].erase(idx);
ls[idx] = nl;
pos[nl].insert(idx);
}
} else {
intt l, r, v;
cin >> l >> r >> v;
auto it = pos[v].lower_bound(l);
auto itt = pos2[v].lower_bound(l);
if(it != pos[v].end() && *it < r) {
cout << *it << " " << *it + 1 << endl;
continue;
}
if(itt != pos2[v].end() && *itt <= r) {
cout << *itt << " " << *itt << endl;
continue;
}
cout << -1 << " " << -1 << endl;
}
}
}
signed main() {
SPEED;
intt tst = 1;
// cin >> tst;
while (tst--) {
solve();
}
}
# | 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... |