Submission #1084319

#TimeUsernameProblemLanguageResultExecution timeMemory
1084319kokoueBirthday gift (IZhO18_treearray)C++14
56 / 100
2598 ms16848 KiB
#include<bits/stdc++.h> #define maxn 2010 #define f first #define s second using namespace std; int n,m,q; vector<int> edges[maxn]; int lc[maxn][maxn]; int st[15][maxn]; int timer=0; int tin[maxn],tout[maxn],depth[maxn]; int seq[maxn]; int tree[4*maxn]; void dfs(int start,int par) { st[0][start]=par; tin[start]=timer++; depth[start]=depth[par]+1; for(auto e:edges[start]) { if(e!=par) { dfs(e,start); } } tout[start]=timer++; } bool is_ancestor(int u,int v) { if(tin[u]<tin[v] && tout[u]>tout[v]) return true; return false; } bool is_low(int u,int v) { if(u==v) return true; if(tin[u]<tin[v] && tout[u]>tout[v]) return true; return false; } int lca(int u,int v) { if(u==v) return u; if(is_ancestor(u,v)) return u; if(is_ancestor(v,u)) return v; if(depth[u]>depth[v]) swap(u,v); for(int i=14;i>=0;i--) { if(!is_ancestor(st[i][u],v)) { u=st[i][u]; } } u=st[0][u]; return u; } void build(int node=1,int l=1,int r=m) { if(l==r) { tree[node]=seq[l]; return; } int mid=(l+r)/2; int left=node<<1,right=left+1; build(left,l,mid); build(right,mid+1,r); tree[node]=lc[tree[left]][tree[right]]; } void update(int idx,int val,int node=1,int l=1,int r=m) { if(idx<l || r<idx) return; if(l==r) { tree[node]=val; return; } int mid=(l+r)/2; int left=node<<1,right=left+1; update(idx,val,left,l,mid); update(idx,val,right,mid+1,r); tree[node]=lc[tree[left]][tree[right]]; } int query(int ql,int qr,int node=1,int l=1,int r=m) { if(qr<l || r<ql) return 0; if(ql<=l && r<=qr) return tree[node]; int mid=(l+r)/2; int left=node<<1,right=left+1; int ans=query(ql,qr,left,l,mid); int rans=query(ql,qr,right,mid+1,r); return lc[ans][rans]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=0;i<n-1;i++) { int a,b; cin>>a>>b; edges[a].push_back(b); edges[b].push_back(a); } dfs(1,1); for(int i=1;i<15;i++) { for(int j=1;j<=n;j++) { st[i][j]=st[i-1][st[i-1][j]]; } } for(int i=1;i<=m;i++) { cin>>seq[i]; } for(int i=1;i<=n;i++) lc[0][i]=lc[i][0]=lc[i][i]=i; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { lc[i][j]=lc[j][i]=lca(i,j); } } build(); for(int i=0;i<q;i++) { int t; cin>>t; if(t==1) { int idx,val; cin>>idx>>val; seq[idx]=val; update(idx,val); } if(t==2) { int l,r,hole; cin>>l>>r>>hole; int idxl=-1,idxr=-1; bool fl=0; for(int j=l;j<=r;j++) { if(is_ancestor(seq[j],hole) || fl) continue; int x=j; for(int b=r-j;b>0 && x<r;b/=2) { while(x+b<=r && is_low(hole,query(j,x+b))) { x+=b; } } if(query(j,x)==hole) { if(idxl==-1) {idxl=j;idxr=x;continue;} if(idxr-idxl<x-j) {idxl=j;idxr=x;} fl=1; } } cout<<idxl<<" "<<idxr<<"\n"; } } } /* 5 4 5 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 2 1 4 1 1 3 5 2 3 4 5 2 1 3 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...