Submission #685549

#TimeUsernameProblemLanguageResultExecution timeMemory
685549speedyArdaBirthday gift (IZhO18_treearray)C++14
100 / 100
1207 ms83416 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 4e5+10; // 4e5 because euler can have 2 * n size which would requires n * 8 size for segment tree or otherwise it could cause error int seglca[MAXN * 4], in[MAXN], out[MAXN], height[MAXN], seq[MAXN]; vector<int> euler; vector< vector<int> > adj(MAXN); set< pair<int, int> > pref[MAXN]; void dfs(int v, int p, int h) { in[v] = euler.size(); euler.push_back(v); height[v] = h; for(int e : adj[v]) { if(e == p) continue; dfs(e, v, h + 1); euler.push_back(v); } out[v] = euler.size() - 1; } void buildlca(int v, int tl, int tr) { if(tl == tr) { seglca[v] = euler[tl]; //cout << v << " " << tl << " " << tr << " " << seglca[v] << "\n"; return; } int tm = (tl + tr) / 2; buildlca(2 * v, tl, tm); buildlca(2 * v + 1, tm + 1, tr); if(height[seglca[v * 2]] < height[seglca[v * 2 + 1]]) seglca[v] = seglca[v * 2]; else seglca[v] = seglca[v * 2 + 1]; //cout << v << " " << tl << " " << tr << " " << seglca[v * 2] << " " << seglca[2 * v + 1] << " " << in[seglca[v * 2]] << " " << in[seglca[v * 2 + 1]] << " " << seglca[v] << "\n"; } int getlca(int v, int tl, int tr, int l, int r) { if(l > r) return -1; if(tl == l && tr == r) return seglca[v]; int tm = (tl + tr) / 2; int left = getlca(2 * v, tl, tm, l, min(r, tm)), right = getlca(2 * v + 1, tm + 1, tr, max(l, tm + 1), r); if(right == -1) return left; if(left == -1) return right; if(height[left] < height[right]) return left; else return right; } int lca(int a, int b) { if(in[a] > in[b]) swap(a, b); return getlca(1, 0, euler.size() - 1, in[a], in[b]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 1; i <= n - 1; i++) { int f, s; cin >> f >> s; adj[f].push_back(s); adj[s].push_back(f); } dfs(1, -1, 0); buildlca(1, 0, euler.size() - 1); for(int i = 0; i < m; i++) { cin >> seq[i]; pref[seq[i]].insert({i, i}); if(i > 0) { pref[lca(seq[i - 1], seq[i])].insert({i - 1, i}); } } while(q--) { int type; cin >> type; if(type == 1) { int pos, val; cin >> pos >> val; pos--; pref[seq[pos]].erase({pos, pos}); if(pos > 0) pref[lca(seq[pos - 1], seq[pos])].erase({pos - 1, pos}); if(pos < m - 1) pref[lca(seq[pos + 1], seq[pos])].erase({pos, pos + 1}); seq[pos] = val; pref[seq[pos]].insert({pos, pos}); if(pos > 0) pref[lca(seq[pos - 1], seq[pos])].insert({pos - 1, pos}); if(pos < m - 1) pref[lca(seq[pos + 1], seq[pos])].insert({pos, pos + 1}); //updateans(1, 0, m - 1, pos, val); } else { int l, r, v; cin >> l >> r >> v; l--; r--; auto it = pref[v].lower_bound({l, l}); if(it != pref[v].end() && (*it).first >= l && (*it).second <= r) cout << (*it).first + 1 << " " << (*it).second + 1 << "\n"; else 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...