제출 #30981

#제출 시각아이디문제언어결과실행 시간메모리
30981Mamnoon_SiamBall Machine (BOI13_ballmachine)C++14
25.38 / 100
853 ms29680 KiB
#include <bits/stdc++.h> using namespace std; #define lc (node<<1) #define rc ((node<<1)|1) #define mid ((b+e)>>1) int par[100010], T[400040]; vector<int> v[100010]; int root; int cntr=1; int a[100010], depth[100010]; bool all[400040]; int n, Q; int table[20][100010], where[100010]; int dfs(int u) { if(v[u].size()==0) return u; vector<pair<int, int>> temp; for(auto b : v[u]) temp.push_back({dfs(b), b}); sort(temp.begin(), temp.end()); v[u].clear(); for(auto b : temp) v[u].push_back(b.second); return min(u, temp[0].first); } void make_arr(int u) { if(v[u].size()==0) { a[cntr]=u; cntr++; return ; } for(auto b : v[u]) make_arr(b); a[cntr] = u; cntr++; return ; } void calc_depth(int u, int d) { depth[u]=d; for(auto b : v[u]) calc_depth(b, d+1); } void remove(int node, int b, int e, int pos) { if(e<pos || b>pos) return ; if(b==e) { all[node]=false; T[node]=0; return ; } if(all[node]) { all[lc]=all[rc]=true; all[node]=false; T[lc]=mid-b+1; T[rc]=e-mid; } remove(lc, b, mid, pos); remove(rc, mid+1, e, pos); T[node]=T[lc]+T[rc]; } void update(int node, int b, int e, int i, int j) { if(b>j || e<i) return ; if(i<=b && e<=j) { all[node]=true; T[node]=e-b+1; return ; } update(lc, b, mid, i, j); update(rc, mid+1, e, i, j); T[node]=T[lc]+T[rc]; } int range_query(int node, int b, int e, int i, int j) { if(e<i || b>j) return 0; if(i<=b && e<=j) return T[node]; if(all[node]==true) { all[lc]=all[rc]=true; all[node]=false; T[lc]=mid-b+1; T[rc]=e-mid; } return range_query(lc, b, mid, i, j)+range_query(rc, mid+1, e, i, j); } int single_query(int pos) { if(pos==0 || pos==-1) return 0; return range_query(1, 1, n, pos, pos); } void make_table() { for(int i=1; i<=n; i++) table[0][i] = ( par[i] != 0 ? par[i] : -1 ); for(int i=1; i<19; i++) { for(int j=1; j<=n; j++) { int md=table[i-1][j]; if(md!=-1) { table[i][j]=table[i-1][md]; } } } } int BS(int x) { int lo=1, hi=n; int middle=(hi+lo)>>1; int ans=0; while(lo<=hi) { int ret=range_query(1, 1, n, 1, middle); ret=middle-ret; if(ret>=x) ans=middle, hi=middle-1; else lo=middle+1; middle=(hi+lo)>>1; } return ans; } int lift_it(int x) { for(int i=18; i>=0; i--) { if(table[i][x]!=-1) { int ret=single_query(where[table[i][x]]); if(ret==1) x=table[i][x]; } } return x; } int main () { cin>>n>>Q; memset(table, -1, sizeof(table)); for(int i=1; i<=n; i++) { cin>>par[i]; if(par[i]==0) root=i; v[par[i]].push_back(i); } dfs(root); make_arr(root); make_table(); calc_depth(root, 1); for(int i=1; i<=n; i++) where[a[i]]=i; for(int i=1; i<=Q; i++) { int op, x; cin>>op>>x; if(op==1) { int temp=BS(x); cout<<a[temp]<<endl; update(1, 1, n, 1, temp); } else { int temp=lift_it(x); cout<<depth[x]-depth[temp]<<endl; remove(1, 1, n, where[temp]); } } //system("pause"); 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...