Submission #1011035

#TimeUsernameProblemLanguageResultExecution timeMemory
1011035phoenixBirthday gift (IZhO18_treearray)C++17
100 / 100
560 ms83280 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200200; vector<int> g[N]; int tin[N], tout[N], T; int par[N][18]; void precalc(int s, int p) { tin[s] = T++; par[s][0] = p; for (int i = 1; i < 18; i++) par[s][i] = par[par[s][i - 1]][i - 1]; for (int to : g[s]) if (to != p) precalc(to, s); tout[s] = T++; } bool up(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; } int lca(int u, int v) { if (up(u, v)) return u; if (up(v, u)) return v; for (int i = 17; i >= 0; i--) if (!up(par[u][i], v)) u = par[u][i]; return par[u][0]; } int n, m, q; int A[N]; set<int> s1[N], s2[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= m; i++) cin >> A[i]; A[0] = A[m + 1] = 1; precalc(1, 1); for (int i = 0; i <= m; i++) { s1[lca(A[i], A[i + 1])].insert(i); s2[A[i]].insert(i); } while (q --> 0) { int t; cin >> t; if (t == 1) { int pos, v; cin >> pos >> v; s2[A[pos]].erase(pos); s1[lca(A[pos], A[pos + 1])].erase(pos); s1[lca(A[pos - 1], A[pos])].erase(pos - 1); A[pos] = v; s2[A[pos]].insert(pos); s1[lca(A[pos], A[pos + 1])].insert(pos); s1[lca(A[pos - 1], A[pos])].insert(pos - 1); } else { int l, r, v; cin >> l >> r >> v; auto it = s1[v].lower_bound(l); if (it != s1[v].end() && *it < r) cout << *it << ' ' << *it + 1; else { it = s2[v].lower_bound(l); if (it != s2[v].end() && *it <= r) cout << *it << ' ' << *it; else cout << -1 << ' ' << -1; } cout << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...