Submission #951828

#TimeUsernameProblemLanguageResultExecution timeMemory
951828ind1vBirthday gift (IZhO18_treearray)C++11
0 / 100
10 ms45660 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; const int L = 20; int n, m, q; vector<int> g[N]; int a[N]; int fst[N], et[2 * N], lv[N]; int lg2[2 * N]; pair<int, int> anc[L][2 * N]; int time_dfs = 0; set<int> sf[N], pr[N]; void pre_dfs(int u, int p) { time_dfs++; fst[u] = time_dfs; et[time_dfs] = u; for (int v : g[u]) { if (v != p) { lv[v] = lv[u] + 1; pre_dfs(v, u); time_dfs++; et[time_dfs] = u; } } } void build_lca() { for (int i = 2; i < 2 * N; i++) { lg2[i] = lg2[i >> 1] + 1; } for (int j = 0; j < L; j++) { for (int i = 1; i + (1 << j) - 1 <= time_dfs; i++) { anc[j][i] = (j == 0 ? pair<int, int>{lv[et[i]], et[i]} : min(anc[j - 1][i], anc[j - 1][i + (1 << (j - 1))])); } } } int lca(int u, int v) { if (fst[u] > fst[v]) { swap(u, v); } int w = lg2[fst[v] - fst[u] + 1]; return min(anc[w][fst[u]], anc[w][fst[v] - (1 << w) + 1]).second; } void upd(int pos, int v) { sf[a[pos]].erase(pos); if (pos > 1) { pr[lca(a[pos - 1], a[pos])].erase(pos - 1); } if (pos < m) { pr[lca(a[pos], a[pos + 1])].erase(pos); } a[pos] = v; sf[a[pos]].insert(pos); if (pos > 1) { pr[lca(a[pos - 1], a[pos])].erase(pos - 1); } if (pos < m) { pr[lca(a[pos], a[pos + 1])].erase(pos); } } void solve(int l, int r, int v) { auto it = sf[v].lower_bound(l); if (it != sf[v].end()) { int x = *it; if (x <= r) { cout << x << ' ' << x << '\n'; return; } } it = pr[v].lower_bound(l); if (it != pr[v].end()) { int x = *it; if (x <= r - 1) { cout << x << ' ' << x + 1 << '\n'; return; } } cout << -1 << ' ' << -1 << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i <= n - 1; i++) { int u, v; cin >> u >> v; g[u].emplace_back(v); g[v].emplace_back(u); } pre_dfs(1, 1); build_lca(); for (int i = 1; i <= m; i++) { cin >> a[i]; } for (int i = 1; i <= m; i++) { sf[a[i]].insert(i); if (i < m) { pr[lca(a[i], a[i + 1])].insert(i); } } while (q--) { int t; cin >> t; if (t == 1) { int pos, v; cin >> pos >> v; upd(pos, v); } else if (t == 2) { int l, r, v; cin >> l >> r >> v; solve(l, r, v); } } 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...