Submission #894465

#TimeUsernameProblemLanguageResultExecution timeMemory
894465nahco314Birthday gift (IZhO18_treearray)C++14
100 / 100
1734 ms96304 KiB
#include <bits/stdc++.h> using namespace std; void dfs(int v, int p, int d, vector<vector<int>>& g, vector<int>& prev, vector<int>& dist) { prev[v] = p; dist[v] = d; for (int nxt : g[v]) { if (nxt == p) continue; dfs(nxt, v, d + 1, g, prev, dist); } } int lca(int a, int b, vector<vector<int>>& prevs, vector<int>& dist) { if (dist[a] < dist[b]) { swap(a, b); } for (int i = 0; i < 32; i++) { if ((dist[a] - dist[b]) >> i & 1) { a = prevs[i][a]; } } if (a == b) { return a; } for (int i = 31; i >= 0; i--) { if (prevs[i][a] != prevs[i][b]) { a = prevs[i][a]; b = prevs[i][b]; } } return prevs[0][a]; } int main() { int n, m, q; cin >> n >> m >> q; vector<vector<int>> g(n); for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; a--; b--; g[a].push_back(b); g[b].push_back(a); } vector<int> a(m); for (int i = 0; i < m; i++) { cin >> a[i]; a[i]--; } vector<vector<int>> prevs(32, vector<int>(n)); vector<int> dist(n); dfs(0, -1, 0, g, prevs[0], dist); for (int i = 1; i < 32; i++) { for (int j = 0; j < n; j++) { if (prevs[i - 1][j] == -1) { prevs[i][j] = -1; } else { prevs[i][j] = prevs[i - 1][prevs[i - 1][j]]; } } } vector<set<int>> rev_anses(n); vector<set<int>> self_anses(n); for (int i = 0; i < m - 1; i++) { int l = lca(a[i], a[i + 1], prevs, dist); rev_anses[l].insert(i); } for (int i = 0; i < m; i++) { self_anses[a[i]].insert(i); } for (int i = 0; i < q; i++) { int query_type; cin >> query_type; if (query_type == 1) { int pos, v; cin >> pos >> v; pos--; v--; if (pos != 0) { int l = lca(a[pos - 1], a[pos], prevs, dist); rev_anses[l].erase(pos - 1); } if (pos != m - 1) { int l = lca(a[pos], a[pos + 1], prevs, dist); rev_anses[l].erase(pos); } self_anses[a[pos]].erase(pos); a[pos] = v; if (pos != 0) { int l = lca(a[pos - 1], a[pos], prevs, dist); rev_anses[l].insert(pos - 1); } if (pos != m - 1) { int l = lca(a[pos], a[pos + 1], prevs, dist); rev_anses[l].insert(pos); } self_anses[a[pos]].insert(pos); } else { int l, r, v; cin >> l >> r >> v; l--; r--; v--; auto e = rev_anses[v].lower_bound(l); if (e == rev_anses[v].end() || *e >= r) { e = self_anses[v].lower_bound(l); if (e == self_anses[v].end() || *e > r) { cout << -1 << " " << -1 << endl; } else { int num = *e + 1; cout << num << " " << num << endl; } } else { int num = *e + 1; cout << num << " " << (num + 1) << endl; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...