Submission #1118068

#TimeUsernameProblemLanguageResultExecution timeMemory
1118068nikolashamiBirthday gift (IZhO18_treearray)C++17
100 / 100
612 ms84808 KiB
#include <bits/stdc++.h> using namespace std; const int N=2e5+4,LG=ceil(log2(N))+1; vector<int>adj[N]; int cale[LG][N],tin[N],tout[N],ti; int n,m,q,a[N],b[N]; void dfs(int u,int p=0){ cale[0][u]=p; for(int i=1;i<LG;++i) cale[i][u]=cale[i-1][cale[i-1][u]]; tin[u]=ti++; for(int v:adj[u]){ if(v^p) dfs(v,u); } tout[u]=ti++; } bool iznad(int u,int v){ return tout[v]<=tout[u]&&tin[v]>=tin[u]; } int lca(int u,int v){ if(iznad(u,v))return u; if(iznad(v,u))return v; for(int i=LG-1;i>=0;--i){ if(!iznad(cale[i][v],u)&&cale[i][v]) v=cale[i][v]; } return cale[0][v]; } set<int>idA[N],idB[N]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>q; for(int i=1,u,v;i<n;++i){ cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } tin[0]=-1e9; tout[0]=1e9; dfs(1); for(int i=1;i<=m;++i) cin>>a[i]; for(int i=1;i<m;++i) b[i]=lca(a[i],a[i+1]); for(int i=1;i<=m;++i){ idA[a[i]].insert(i); if(i<m)idB[b[i]].insert(i); } while(q--){ int tp; cin>>tp; if(tp==2){ int l,r,x; cin>>l>>r>>x; auto it1=idA[x].lower_bound(l); auto it2=idB[x].lower_bound(l); if(it1!=idA[x].end()&&*it1<=r) cout<<*it1<<' '<<*it1<<'\n'; else if(it2!=idB[x].end()&&*it2<r) cout<<*it2<<' '<<*it2+1<<'\n'; else cout<<-1<<' '<<-1<<'\n'; }else{ int id,x; cin>>id>>x; idA[a[id]].erase(id); a[id]=x; idA[a[id]].insert(id); if(id+1<=m){ idB[b[id]].erase(id); b[id]=lca(a[id],a[id+1]); idB[b[id]].insert(id); } if(id-1>=1){ idB[b[id-1]].erase(id-1); b[id-1]=lca(a[id],a[id-1]); idB[b[id-1]].insert(id-1); } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...