#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define F first
#define S second
#define pb push_back
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define Fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
const int N = 2e5 + 7;
const int R = 1e9 + 10;
const ll INF = 1e18;
const ll MOD = 1e9 + 7;
const int B = 320;
vector < int > g[N];
int a[N], tin[N], tout[N], timer, up[N][22], d[N];
set < int > all[N], lon[N];
void dfs(int v, int p) {
if (p == 0) up[v][0] = v;
else up[v][0] = p;
tin[v] = timer++;
if (p == 0) {
d[v] = 0;
} else {
d[v] = d[p] + 1;
}
for (int i = 1; i <= 20; i++) {
up[v][i] = up[up[v][i - 1]][i - 1];
}
for (int to : g[v]) {
if (to == p) continue;
dfs(to, v);
}
tout[v] = timer++;
}
bool upper(int x, int y) {
if (tin[x] <= tin[y] && tout[y] <= tout[x]) {
return true;
}
return false;
}
int lca(int x, int y) {
if (upper(x, y)) return x;
if (upper(y, x)) return y;
for (int i = 20; i >= 0; i--) {
if (!upper(up[x][i], y)) {
x = up[x][i];
}
}
return up[x][0];
}
void solve() {
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1, 0);
for (int i = 1; i <= m; i++) {
cin >> a[i];
lon[a[i]].insert(i);
}
for (int i = 1; i < m; i++) {
all[lca(a[i], a[i + 1])].insert(i);
}
// for (int i = 1; i <= n; i++) {
// cout << i << ": ";
// for (int x : all[i]) {
// cout << x << ' ';
// }
// cout << "\n";
// }
while (q--) {
int type;
cin >> type;
if (type == 1) {
int pos, v;
cin >> pos >> v;
all[lca(a[pos], a[pos + 1])].erase(pos);
all[lca(a[pos], a[pos - 1])].erase(pos - 1);
lon[a[pos]].erase(pos);
a[pos] = v;
all[lca(v, a[pos + 1])].insert(pos);
all[lca(v, a[pos - 1])].insert(pos - 1);
lon[a[pos]].insert(pos);
} else {
int l, r, v;
cin >> l >> r >> v;
auto pos = all[v].lower_bound(l);
int ind = *pos;
// cout << ind << '\n';
if (l <= ind && ind < r && pos != all[v].end()) {
cout << ind << ' ' << ind + 1 << '\n';
continue;
}
auto j = lon[v].lower_bound(l);
if (l <= *j && *j <= r && j != lon[v].end()) {
cout << *j << ' ' << *j << '\n';
continue;
}
cout << -1 << ' ' << -1 << '\n';
}
}
// 1: 2, 3
// 2:
// 3: 1,
// 4:
// 5:
}
int main() {
// freopen("gates.in", "r", stdin);
// freopen("gates.out", "w", stdout);
Fast
int tc = 1;
// cin >> tc;
while (tc--) {
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... |