Submission #341701

#TimeUsernameProblemLanguageResultExecution timeMemory
341701ivan_tudorBirthday gift (IZhO18_treearray)C++14
100 / 100
1650 ms87448 KiB
#include<bits/stdc++.h> using namespace std; const int N = 2*1e5 + 5; vector<int> gr[N]; int par[18][N]; int in[N], out[N]; void dfs(int nod, int dad, int &cnt){ par[0][nod] = dad; in[nod]= ++cnt; for(auto x :gr[nod]){ if(x!=dad) dfs(x, nod, cnt); } out[nod] = cnt; } bool is_dad(int dad, int nod){ if(in[dad]<= in[nod] && out[nod]<= out[dad]) return true; return false; } int get_lca(int a,int b){ for(int log = 17; log>=0; log--){ if(par[log][a]!=0 && is_dad(par[log][a], b)== false) a = par[log][a]; } if(is_dad(a, b) == false) a = par[0][a]; return a; } int v[N]; int lc[N]; set<int> pzv[N]; set<int> pzl[N]; int query(set<int> &pz, int l,int r){ auto it = pz.lower_bound(l); if(it==pz.end()) return -1; if((*it) <=r) return (*it); return -1; } int main() { //freopen(".in","r",stdin); ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n, m, q; cin>>n>>m>>q; for(int i=1;i<n;i++){ int a, b; cin>>a>>b; gr[a].push_back(b); gr[b].push_back(a); } int cnt =0; dfs(1, 0, cnt); for(int log =1 ; log < 18; log ++){ for(int nod = 1; nod<=n;nod++){ par[log][nod] = par[log-1][par[log-1][nod]]; } } for(int i=1;i<=m;i++){ cin>>v[i]; pzv[v[i]].insert(i); } for(int i=1;i<m;i++){ lc[i] = get_lca(v[i], v[i+1]); pzl[lc[i]].insert(i); } for(int i=1;i<=q;i++){ int tip; cin>>tip; if(tip == 1){ int poz, val; cin>>poz>>val; pzv[v[poz]].erase(poz); if(poz < m) pzl[lc[poz]].erase(poz); if(poz > 1) pzl[lc[poz-1]].erase(poz - 1); v[poz] = val; pzv[v[poz]].insert(poz); if(poz < m){ lc[poz] = get_lca(v[poz], v[poz + 1]); pzl[lc[poz]].insert(poz); } if(poz > 1){ lc[poz-1] = get_lca(v[poz-1], v[poz]); pzl[lc[poz-1]].insert(poz -1); } } else { int val, l , r; cin>>l>>r>>val; int ans = query(pzv[val], l, r); if(ans != -1){ cout<<ans<<" "<<ans<<"\n"; continue; } ans = query(pzl[val], l, r-1); if(ans!= -1){ cout<<ans<<" "<<ans + 1<<"\n"; continue; } cout<<"-1"<<" "<<"-1"<<"\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...