Submission #713287

#TimeUsernameProblemLanguageResultExecution timeMemory
713287amirhoseinfar1385Birthday gift (IZhO18_treearray)C++17
100 / 100
1290 ms77700 KiB
#include<bits/stdc++.h> using namespace std; int n,m,q; const int maxn=200000+10; vector<int>adj[maxn]; int timea=0; pair<int,int>stf[maxn]; int lca[19][maxn]; void dfs(int u,int par=0){ timea++; stf[u].first=timea; lca[0][u]=par; for(auto x:adj[u]){ if(x==par){ continue; } dfs(x,u); } stf[u].second=timea; } void callca(){ for(int i=1;i<19;i++){ for(int j=1;j<=n;j++){ lca[i][j]=lca[i-1][lca[i-1][j]]; } } } bool zird(int u,int v){ if(stf[v].first<=stf[u].first&&stf[v].second>=stf[u].second){ return 1; } return 0; } int getlca(int u,int v){ if(zird(u,v)){ return v; } if(zird(v,u)){ return u; } for(int i=18;i>=0;i--){ if(lca[i][u]!=0&&!zird(v,lca[i][u])){ u=lca[i][u]; } } u=lca[0][u]; return u; } set<pair<int,int>>st[maxn]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=0;i<n-1;i++){ int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1); callca(); vector<int>allm(m); for(int i=0;i<m;i++){ cin>>allm[i]; } for(int i=0;i<m;i++){ st[allm[i]].insert(make_pair(i,i)); if(i!=m-1){ st[getlca(allm[i],allm[i+1])].insert(make_pair(i,i+1)); } } for(int i=0;i<q;i++){ int qq; cin>>qq; if(qq==1){ int ind,v; cin>>ind>>v; ind--; st[allm[ind]].erase(make_pair(ind,ind)); if(ind!=m-1){ st[getlca(allm[ind],allm[ind+1])].erase(make_pair(ind,ind+1)); } if(ind!=0){ st[getlca(allm[ind],allm[ind-1])].erase(make_pair(ind-1,ind)); } allm[ind]=v; st[allm[ind]].insert(make_pair(ind,ind)); if(ind!=m-1){ st[getlca(allm[ind],allm[ind+1])].insert(make_pair(ind,ind+1)); } if(ind!=0){ st[getlca(allm[ind],allm[ind-1])].insert(make_pair(ind-1,ind)); } } else{ int l,r,v; cin>>l>>r>>v; l--; r--; auto xx=st[v].lower_bound(make_pair(l,0)); if(xx==st[v].end()){ cout<<-1<<" "<<-1<<"\n"; continue; } auto x=*xx; if(x.second<=r){ cout<<x.first+1<<" "<<x.second+1<<"\n"; } else{ 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...