제출 #1283671

#제출 시각아이디문제언어결과실행 시간메모리
1283671Jawad_Akbar_JJBirthday gift (IZhO18_treearray)C++20
0 / 100
8 ms24120 KiB
#include <iostream> #include <vector> #include <set> using namespace std; const int N = 1<<18; vector<int> nei[N]; set<int> Vc[N]; int par[N][18], hei[N], ps[N], ind[N]; void dfs(int u, int p){ par[u][0] = p, hei[u] = hei[p] + 1; for (int i=1;i<18;i++) par[u][i] = par[par[u][i-1]][i-1]; for (int i : nei[u]) if (i != p) dfs(i, u); } int Lca(int u, int v){ if (hei[u] > hei[v]) swap(u, v); for (int i=17;i>=0;i--){ if ((1<<i) + hei[u] <= hei[v]) v = par[v][i]; } for (int i=17;i>=0;i--){ if (par[u][i] != par[v][i]) u = par[u][i], v = par[v][i]; } return (u == v ? u : par[u][0]); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m, q; cin>>n>>m>>q; for (int i=1, a, b;i<n;i++){ cin>>a>>b; nei[a].push_back(b); nei[b].push_back(a); } dfs(1, 0); for (int i=1;i<=m;i++){ cin>>ps[i]; if (i > 1) Vc[Lca(ps[i], ps[i-1])].insert(i); ind[ps[i]] = i; } for (int i=1, t, l, r, pos, v;i<=q;i++){ cin>>t; if (t == 1){ cin>>pos>>v; ind[ps[pos]] = 0; if (pos > 1){ Vc[Lca(ps[pos], ps[pos-1])].erase(pos); Vc[Lca(v, ps[pos-1])].insert(pos); } if (pos < m){ Vc[Lca(ps[pos], ps[pos+1])].erase(pos); Vc[Lca(v, ps[pos+1])].insert(pos); } ps[pos] = v; ind[v] = pos; continue; } cin>>l>>r>>v; auto u = Vc[v].upper_bound(l); if (ind[v]) cout<<ind[v]<<" "<<ind[v]<<'\n'; else if (u == Vc[v].end() or *u > r) cout<<"-1 -1\n"; else cout<<(*u) -1<<" "<<(*u)<<'\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...