Submission #239111

#TimeUsernameProblemLanguageResultExecution timeMemory
239111kshitij_sodaniBirthday gift (IZhO18_treearray)C++17
100 / 100
1439 ms75556 KiB
#include <bits/stdc++.h> using namespace std; typedef int64_t llo; #define mp make_pair #define pb push_back #define a first #define b second int n,m,q; set<pair<int,int>> ac[200001]; vector<int> adj[200001]; int it[200001]; int tt[200001]; int par[200001][20]; int lev[200001]; void dfs(int no,int par2=-1,int levv=0){ par[no][0]=par2; lev[no]=levv; for(auto j:adj[no]){ if(j!=par2){ dfs(j,no,levv+1); } } } int lca(int aa,int bb){ if(lev[aa]>lev[bb]){ swap(aa,bb); } int kk=lev[bb]-lev[aa]; for(int j=19;j>=0;j--){ if(kk&(1<<j)){ bb=par[bb][j]; } } if(aa==bb){ return aa; } for(int j=19;j>=0;j--){ if(par[aa][j]==par[bb][j]){ continue; } aa=par[aa][j]; bb=par[bb][j]; } return par[aa][0]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>m>>q; for(int i=0;i<n-1;i++){ int aa,bb; cin>>aa>>bb; adj[aa-1].pb(bb-1); adj[bb-1].pb(aa-1); } for(int i=0;i<m;i++){ cin>>it[i]; it[i]--; } dfs(0); for(int j=1;j<20;j++){ for(int i=0;i<n;i++){ if(par[i][j-1]==-1){ par[i][j]=-1; } else{ par[i][j]=par[par[i][j-1]][j-1]; } } } for(int i=0;i<m-1;i++){ tt[i]=lca(it[i],it[i+1]); ac[tt[i]].insert({i,1}); } for(int i=0;i<m;i++){ ac[it[i]].insert({i,0}); } for(int i=0;i<q;i++){ int aa; cin>>aa; if(aa==2){ int ind,l,r; cin>>l>>r>>ind; l--; r--; ind--; auto x=ac[ind].lower_bound({l,0}); if(x!=ac[ind].end()){ if((*x).b==0){ if((*x).a<=r){ cout<<(*x).a+1<<" "<<(*x).a+1<<endl; continue; } } else{ if((*x).a+1<=r){ cout<<(*x).a+1<<" "<<(*x).a+2<<endl; continue; } } } cout<<"-1 -1"<<endl; } else{ int ind; int val; cin>>ind>>val; ind--; val--; ac[it[ind]].erase({ind,0}); if(ind<m-1){ ac[tt[ind]].erase({ind,1}); } if(ind>0){ ac[tt[ind-1]].erase({ind-1,1}); } it[ind]=val; ac[it[ind]].insert({ind,0}); if(ind<m-1){ tt[ind]=lca(it[ind],it[ind+1]); ac[tt[ind]].insert({ind,1}); // cout<<tt[ind]<<endl; } if(ind>0){ tt[ind-1]=lca(it[ind-1],it[ind]); ac[tt[ind-1]].insert({ind-1,1}); // cout<<tt[ind-1]<<endl; } } } 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...