Submission #873583

#TimeUsernameProblemLanguageResultExecution timeMemory
873583epicci23Birthday gift (IZhO18_treearray)C++17
30 / 100
4040 ms9320 KiB
#include "bits/stdc++.h" using namespace std; #define int long long #define sz(x) ((int)(x).size()) #define all(x) (x).begin(),(x).end() #define endl "\n" #define pb push_back /* dont get stuck on one approach write stuff on paper edge cases(n=1?) look for : dp,bs,bf,observations... implement and debug smarter */ const int N = 2e5; const int LOG = 20; vector<int> v[N]; int lift[N][LOG]; int depth[N]; void dfs(int c,int p,int d){ depth[c]=d; lift[c][0]=p; for(int i=1;i<LOG;i++) lift[c][i]=lift[lift[c][i-1]][i-1]; for(int x:v[c]){ if(x==p) continue; dfs(x,c,d+1); } } int lca(int a,int b){ if(depth[a]<depth[b]) swap(a,b); int x = depth[a] - depth[b]; for(int i=0;i<LOG;i++) if(x&(1LL<<i)) a=lift[a][i]; if(a==b) return a; for(int i=LOG-1;i>=0;i--){ if(lift[a][i]!=lift[b][i]){ a=lift[a][i]; b=lift[b][i]; } } return lift[a][0]; } void solve(){ int n,m,q; cin >> n >> m >> q; for(int i=1;i<n;i++){ int a,b; cin >> a >> b; v[a].pb(b); v[b].pb(a); } dfs(1,0,0); int ar[m+5]; for(int i=1;i<=m;i++) cin >> ar[i]; while(q--){ int op; cin >> op; if(op==1){ int ind,u; cin >> ind >> u; ar[ind]=u; } else{ int l,r,u; cin >> l >> r >> u; bool ok=0; for(int i=l;i<=r;i++){ int cur = ar[i]; if(ok) break; for(int j=i;j<=r;j++){ // cout << cur << " " << ar[j] << endl; cur=lca(cur,ar[j]); // cout << i << " " << j << " lca: " << cur << endl; if(cur==u){ ok=1; cout << i << " " << j << endl; break; } } if(ok) break; } if(ok==0) cout << -1 << " " << -1 << endl; } } } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int t=1;//cin >> t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...