Submission #1235805

#TimeUsernameProblemLanguageResultExecution timeMemory
1235805bach25089Birthday gift (IZhO18_treearray)C++20
0 / 100
2 ms5184 KiB
#include <bits/stdc++.h> using namespace std; int n, m, q, t = 0; vector<int> g[200005]; int up[20][200005], dep[200005], in[200005], out[200005]; int a[200005]; void dfs(int u, int p) { in[u] = ++t; up[0][u] = p; dep[u] = dep[p] + 1; for (int v : g[u]) { if (v != p) dfs(v, u); } out[u] = t; } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); int d = dep[u] - dep[v]; for (int k = 0; k < 20; k++) { if (d >> k & 1) u = up[k][u]; } if (u == v) return u; for (int k = 19; k >= 0; k--) { if (up[k][u] != up[k][v])u = up[k][u], v = up[k][v]; } return up[0][u]; } struct N { int l, r; int lca, mi, ma; } st[800005]; N mg(N A, N B) { return { A.l, B.r, lca(A.lca, B.lca), min(A.mi, B.mi), max(A.ma, B.ma) }; } void bd(int p, int l, int r) { if (l == r) { st[p] = {l, r, a[l], in[a[l]], in[a[l]]}; } else { int m = (l + r) / 2; bd(p*2, l, m); bd(p*2+1, m+1, r); st[p] = mg(st[p*2], st[p*2+1]); } } void updt(int p, int i, int v) { if (st[p].l == st[p].r) { a[i] = v; st[p] = {i, i, v, in[v], in[v]}; } else { int m = (st[p].l + st[p].r) / 2; if (i <= m) updt(p*2, i, v); else updt(p*2+1, i, v); st[p] = mg(st[p*2], st[p*2+1]); } } pair<int, int> qry(int p, int l, int r, int v) { N &nd = st[p]; if (nd.r < l || nd.l > r) return {-1, -1}; if (l <= nd.l && nd.r <= r) { if (nd.mi < in[v] || nd.ma > out[v]) return {-1, -1}; if (nd.lca == v) return {max(nd.l, l), min(nd.r, r)}; if (nd.l == nd.r) return {-1, -1}; } auto L = qry(p*2, l, r, v); if (L.first != -1) return L; return qry(p*2+1, l, r, v); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; for (int i = 1, u, v; i < n; i++) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1, 0); for (int k = 1; k < 20; k++) { for (int i = 1; i <= n; i++) { up[k][i] = up[k-1][up[k-1][i]]; } } for (int i = 1; i <= m; i++) { cin >> a[i]; } bd(1, 1, m); while (q--) { int ty; cin >> ty; if (ty == 1) { int i, v; cin >> i >> v; updt(1, i, v); } else { int l, r, v; cin >> l >> r >> v; auto ans = qry(1, l, r, v); if (ans.first == -1) cout << "-1 -1\n"; else cout << ans.first << " " << ans.second << "\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...