Submission #887384

#TimeUsernameProblemLanguageResultExecution timeMemory
887384pccBirthday gift (IZhO18_treearray)C++14
56 / 100
459 ms262144 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> #define mid ((l+r)>>1) const int mxn = 2e5+10; int n,m,q; pii dfn[mxn]; int par[mxn][20]; int dep[mxn]; vector<int> tree[mxn]; int arr[mxn]; int ppp = 0; set<pair<int,pii>> segtree[mxn*4]; void dfs(int now){ for(int i = 1;i<20;i++)par[now][i] = par[par[now][i-1]][i-1]; for(auto nxt:tree[now]){ if(nxt == par[now][0])continue; dep[nxt] = dep[now]+1; par[nxt][0] = now; dfs(nxt); } return; } int anc(int a,int b){ if(dep[a]<dep[b])swap(a,b); int d = dep[a]-dep[b]; for(int i = 19;i>=0;i--){ if(d&(1<<i))a = par[a][i]; } for(int i = 19;i>=0;i--){ if(par[a][i] != par[b][i])a = par[a][i],b = par[b][i]; } return a==b?a:par[a][0]; } void maketree(int now,int l,int r){ if(l == r){ segtree[now].insert(make_pair(arr[l],make_pair(l,l))); return; } maketree(now*2+1,l,mid); maketree(now*2+2,mid+1,r); for(auto &i:segtree[now*2+1])segtree[now].insert(i); for(auto &i:segtree[now*2+2])segtree[now].insert(i); segtree[now].insert({anc(arr[mid],arr[mid+1]),{mid,mid+1}}); //cout<<now<<":"<<l<<' '<<r<<":";for(auto &i:segtree[now])cout<<i.fs<<',';cout<<endl; return; } void modify(int now,int l,int r,int p,int v){ segtree[now].erase(segtree[now].find({arr[p],{p,p}})); segtree[now].insert({v,{p,p}}); if(p != l){ segtree[now].erase(segtree[now].find({anc(arr[p-1],arr[p]),{p-1,p}})); segtree[now].insert({anc(arr[p-1],v),{p-1,p}}); } if(p != r){ segtree[now].erase(segtree[now].find({anc(arr[p],arr[p+1]),{p,p+1}})); segtree[now].insert({anc(arr[p+1],v),{p,p+1}}); } if(l == r)return; if(mid>=p)modify(now*2+1,l,mid,p,v); else modify(now*2+2,mid+1,r,p,v); return; } pii getval(int now,int l,int r,int s,int e,int tar){ if(l>=s&&e>=r){ auto it = segtree[now].lower_bound({tar,{0,0}}); if(it != segtree[now].end()&&it->fs == tar){ return it->sc; } else return {-1,-1}; } if(mid>=e)return getval(now*2+1,l,mid,s,e,tar); else if(mid<s)return getval(now*2+2,mid+1,r,s,e,tar); else{ if(anc(arr[mid],arr[mid+1]) == tar)return {mid,mid+1}; auto re = getval(now*2+1,l,mid,s,e,tar); if(re.fs != -1)return re; else return getval(now*2+2,mid+1,r,s,e,tar); } } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m>>q; for(int i = 1;i<n;i++){ int a,b; cin>>a>>b; tree[a].push_back(b); tree[b].push_back(a); } for(int i = 1;i<=m;i++){ cin>>arr[i]; } par[1][0] = 1; dfs(1); maketree(0,1,m); //for(auto &i:segtree[0])cout<<i.fs<<' '<<i.sc.fs<<','<<i.sc.sc<<';'; while(q--){ int tp; cin>>tp; if(tp == 1){ int p,v; cin>>p>>v; modify(0,1,m,p,v); arr[p] = v; } else{ int l,r,v; cin>>l>>r>>v; auto re = getval(0,1,m,l,r,v); cout<<re.fs<<' '<<re.sc<<'\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...