#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; return ; }
for(auto b : v[u]) make_arr(b);
a[cntr++] = u; where[u]=cntr-1; 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<=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]);
}
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
15696 KB |
Output isn't correct |
2 |
Incorrect |
489 ms |
16752 KB |
Output isn't correct |
3 |
Incorrect |
299 ms |
16752 KB |
Output isn't correct |
4 |
Incorrect |
6 ms |
15696 KB |
Output isn't correct |
5 |
Incorrect |
0 ms |
15696 KB |
Output isn't correct |
6 |
Correct |
0 ms |
15696 KB |
Output is correct |
7 |
Correct |
3 ms |
15696 KB |
Output is correct |
8 |
Incorrect |
9 ms |
15696 KB |
Output isn't correct |
9 |
Incorrect |
39 ms |
15828 KB |
Output isn't correct |
10 |
Incorrect |
76 ms |
15960 KB |
Output isn't correct |
11 |
Incorrect |
433 ms |
16752 KB |
Output isn't correct |
12 |
Runtime error |
186 ms |
16752 KB |
Execution timed out (wall clock limit exceeded) |
13 |
Runtime error |
373 ms |
16752 KB |
Execution timed out (wall clock limit exceeded) |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
266 ms |
18092 KB |
Output isn't correct |
2 |
Runtime error |
909 ms |
23408 KB |
Execution timed out (wall clock limit exceeded) |
3 |
Runtime error |
326 ms |
18104 KB |
Execution timed out (wall clock limit exceeded) |
4 |
Incorrect |
419 ms |
18004 KB |
Output isn't correct |
5 |
Incorrect |
596 ms |
17996 KB |
Output isn't correct |
6 |
Runtime error |
603 ms |
18000 KB |
Execution timed out (wall clock limit exceeded) |
7 |
Runtime error |
359 ms |
16988 KB |
Execution timed out (wall clock limit exceeded) |
8 |
Incorrect |
309 ms |
18100 KB |
Output isn't correct |
9 |
Runtime error |
583 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
10 |
Runtime error |
556 ms |
23412 KB |
Execution timed out (wall clock limit exceeded) |
11 |
Runtime error |
759 ms |
23408 KB |
Execution timed out (wall clock limit exceeded) |
12 |
Runtime error |
656 ms |
20352 KB |
Execution timed out (wall clock limit exceeded) |
13 |
Runtime error |
489 ms |
27992 KB |
Execution timed out (wall clock limit exceeded) |
14 |
Incorrect |
353 ms |
18104 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
306 ms |
19492 KB |
Output is correct |
2 |
Runtime error |
816 ms |
20548 KB |
Execution timed out (wall clock limit exceeded) |
3 |
Correct |
686 ms |
26832 KB |
Output is correct |
4 |
Runtime error |
436 ms |
21928 KB |
Execution timed out (wall clock limit exceeded) |
5 |
Correct |
623 ms |
21928 KB |
Output is correct |
6 |
Runtime error |
629 ms |
21928 KB |
Execution timed out (wall clock limit exceeded) |
7 |
Runtime error |
659 ms |
19476 KB |
Execution timed out (wall clock limit exceeded) |
8 |
Correct |
576 ms |
26824 KB |
Output is correct |
9 |
Runtime error |
359 ms |
23420 KB |
Execution timed out (wall clock limit exceeded) |
10 |
Runtime error |
606 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
11 |
Runtime error |
576 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
12 |
Runtime error |
643 ms |
20548 KB |
Execution timed out (wall clock limit exceeded) |
13 |
Runtime error |
686 ms |
29672 KB |
Execution timed out (wall clock limit exceeded) |
14 |
Runtime error |
356 ms |
18108 KB |
Execution timed out (wall clock limit exceeded) |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
683 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
2 |
Runtime error |
639 ms |
20548 KB |
Execution timed out (wall clock limit exceeded) |
3 |
Runtime error |
479 ms |
29680 KB |
Execution timed out (wall clock limit exceeded) |
4 |
Runtime error |
613 ms |
23412 KB |
Execution timed out (wall clock limit exceeded) |
5 |
Runtime error |
693 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
6 |
Runtime error |
673 ms |
23416 KB |
Execution timed out (wall clock limit exceeded) |
7 |
Runtime error |
556 ms |
20548 KB |
Execution timed out (wall clock limit exceeded) |
8 |
Runtime error |
479 ms |
29680 KB |
Execution timed out (wall clock limit exceeded) |
9 |
Runtime error |
259 ms |
18108 KB |
Execution timed out (wall clock limit exceeded) |