제출 #492387

#제출 시각아이디문제언어결과실행 시간메모리
492387vuhoanggiapBirthday gift (IZhO18_treearray)C++17
100 / 100
830 ms102348 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; const int maxN = 2e5 + 1; int n, m, q; vector<int> adj[maxN]; int f[maxN], s[2 * maxN], euler; int h[maxN]; void dfs(int u, int p = 1) { s[++euler] = u; f[u] = euler; for (auto v : adj[u]) { if (v == p) continue; h[v] = h[u] + 1; dfs(v, u); s[++euler] = u; } } int lg[2 * maxN]; int sp[2 * maxN][20]; void build() { lg[1] = 0; for (int i = 2; i <= euler; i++) lg[i] = lg[i >> 1] + 1; for (int len = 0; (1 << len) <= euler; len++) { for (int i = 1; i + (1 << len) - 1 <= euler; i++) { if (!len) sp[i][0] = s[i]; else { if (h[sp[i][len - 1]] < h[sp[i + (1 << (len - 1))][len - 1]]) sp[i][len] = sp[i][len - 1]; else sp[i][len] = sp[i + (1 << (len - 1))][len - 1]; } } } } int lca(int u, int v) { int l = f[u], r = f[v]; if (l > r) swap(l, r); int Lg = lg[r - l + 1]; if (h[sp[l][Lg]] < h[sp[r - (1 << Lg) + 1][Lg]]) return sp[l][Lg]; return sp[r - (1 << Lg) + 1][Lg]; } int a[maxN]; set<int> id[maxN], id2[maxN]; void add(int i) { if (!i || i == n) return; int val = lca(a[i], a[i + 1]); id2[val].insert(i); } void rem(int i) { if (!i || i == n) return; int val = lca(a[i], a[i + 1]); id2[val].erase(i); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } //5 4 4 //1 2 //3 1 //3 4 //5 3 //4 5 2 3 //2 1 3 1 //1 3 5 //2 3 4 5 //2 1 3 1 dfs(1); build(); for (int i = 1; i <= m; i++) { cin >> a[i]; id[a[i]].insert(i); add(i - 1); } // cout << "id: "; for (int i = 1; i <= n; i++) { // cout << "val: " << i << '\t'; // for (auto x : id[i]) cout << x << ' '; cout << '\n'; // } // cout << "id2: "; // for (int i = 1; i <= n; i++) { // cout << "val: " << i << '\t'; // for (auto x : id2[i]) cout << x << ' '; cout << '\n'; // } for (int i = 1; i <= q; i++) { int type; cin >> type; if (type == 1) { int pos, v; cin >> pos >> v; id[a[pos]].erase(pos); rem(pos - 1); rem(pos); a[pos] = v; add(pos); add(pos - 1); id[a[pos]].insert(pos); } else { int l, r, v; cin >> l >> r >> v; set<int>::iterator it = id[v].lower_bound(l); bool foundAns = false; if (it != id[v].end()) { int val = *it; if (val <= r) { cout << val << ' ' << val << '\n'; foundAns = true; } } it = id2[v].lower_bound(l); if (it != id2[v].end() && !foundAns) { int val = *it; if (val < r) { cout << val << ' ' << val + 1 << '\n'; foundAns = true; } } if (!foundAns) cout << -1 << ' ' << -1 << '\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...