제출 #1088594

#제출 시각아이디문제언어결과실행 시간메모리
1088594vladiliusBirthday gift (IZhO18_treearray)C++17
100 / 100
710 ms81556 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, q; cin>>n>>m>>q; vector<int> g[n + 1]; for (int i = 1; i < n; i++){ int u, v; cin>>u>>v; g[u].pb(v); g[v].pb(u); } const int lg = log2(n); vector<vector<int>> pw(n + 1, vector<int>(lg + 1)); vector<int> tin(n + 1), tout(n + 1); int timer = 0; function<void(int, int)> fill = [&](int v, int pr){ tin[v] = ++timer; pw[v][0] = pr; for (int i = 1; i <= lg; i++){ pw[v][i] = pw[pw[v][i - 1]][i - 1]; } for (int i: g[v]){ if (i == pr) continue; fill(i, v); } tout[v] = timer; }; fill(1, 1); auto check = [&](int x, int y){ return (tin[x] <= tin[y] && tout[x] >= tout[y]); }; auto lca = [&](int x, int y){ if (check(x, y)) return x; if (check(y, x)) return y; for (int i = lg; i >= 0; i--){ if (!check(pw[x][i], y)){ x = pw[x][i]; } } return pw[x][0]; }; vector<int> a(m + 1); set<int> st[n + 1]; for (int i = 1; i <= m; i++){ cin>>a[i]; st[a[i]].insert(i); } set<int> st1[n + 1]; for (int i = 1; i + 1 <= m; i++){ st1[lca(a[i], a[i + 1])].insert(i); } while (q--){ int type; cin>>type; if (type == 1){ int p, v; cin>>p>>v; if (p > 1) st1[lca(a[p - 1], a[p])].erase(p - 1); if (p < m) st1[lca(a[p], a[p + 1])].erase(p); st[a[p]].erase(p); a[p] = v; st[v].insert(p); if (p > 1) st1[lca(a[p - 1], a[p])].insert(p - 1); if (p < m) st1[lca(a[p], a[p + 1])].insert(p); } else { int l, r, v; cin>>l>>r>>v; auto it = st[v].lower_bound(l); if (it != st[v].end() && (*it) <= r){ cout<<(*it)<<" "<<(*it)<<"\n"; continue; } it = st1[v].lower_bound(l); if (it != st1[v].end() && (*it) < r){ cout<<(*it)<<" "<<(*it) + 1<<"\n"; continue; } 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...