제출 #847036

#제출 시각아이디문제언어결과실행 시간메모리
847036GrandTiger1729Birthday gift (IZhO18_treearray)C++17
56 / 100
4043 ms38492 KiB
#include <bits/stdc++.h> using namespace std; int main() { cin.tie(0)->sync_with_stdio(0); // freopen("in.in", "r", stdin); // freopen("out.out", "w", stdout); int n, m, q; cin >> n >> m >> q; vector<vector<int>> g(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); } vector<int> in(n), out(n); vector<vector<int>> up(n, vector<int>(__lg(n) + 1)); { int t = 0; vector<bool> vis(n); function<void(int)> dfs = [&](int u) { vis[u] = 1; in[u] = t++; for (int i = 1; i <= __lg(n); i++) up[u][i] = up[up[u][i - 1]][i - 1]; for (auto &v : g[u]) { if (vis[v]) continue; up[v][0] = u; dfs(v); } out[u] = t; }; dfs(0); } auto anc = [&](int u, int v) -> bool { return in[u] <= in[v] && out[u] >= out[v]; }; auto lca = [&](int u, int v) -> int { if (anc(u, v)) return u; for (int i = __lg(n); i >= 0; i--) if (!anc(up[u][i], v)) u = up[u][i]; return up[u][0]; }; vector<int> a(m); for (int i = 0; i < m; i++) cin >> a[i], a[i]--; while (q--) { int ty; cin >> ty; if (ty == 1) { int i, u; cin >> i >> u; i--, u--; a[i] = u; } else { int l, r, u; cin >> l >> r >> u; l--, u--; int ans = -1; for (int i = l; i < r; i++) { if (a[i] == u) ans = i; } if (ans != -1) { cout << ans + 1 << ' ' << ans + 1 << '\n'; continue; } for (int i = l; i < r - 1; i++) { if (lca(a[i], a[i + 1]) == u) ans = i; } if (ans == -1) cout << "-1 -1\n"; else cout << ans + 1 << ' ' << ans + 2 << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...