#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int N = 1<<17;
vector<int> nei[N];
int st[N], ch[N], Par[N][20], Mn[N], ft[N], ord[N], c1, c2;
void dfs2(int u){
vector<pair<int,int>> nb;
for (int i : nei[u])
nb.push_back({Mn[i], i});
sort(nb.begin(), nb.end());
for (auto [mn, i] : nb)
dfs2(i);
ord[u] = ++c1;
}
void dfs1(int u, int p){
ch[u] = 1, st[u] = ++c2, Mn[u] = u;
Par[u][0] = p;
for (int i=0;i<17;i++)
Par[u][i+1] = Par[Par[u][i]][i];
for (int i : nei[u]){
dfs1(i, u);
Mn[u] = min(Mn[u], Mn[i]);
ch[u] += ch[i];
}
}
void Add(int i, int v){
for (; i < N; i += i & -i)
ft[i] += v;
}
int get(int i, int ans = 0){
for (; i; i -= i & -i)
ans += ft[i];
return ans;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, p, q;
cin>>n>>q;
cin>>p;
for (int i=2;i<=n;i++){
cin>>p;
nei[p].push_back(i);
}
dfs1(1, 0);
dfs2(1);
set<pair<int,int>> stt;
for (int i=1;i<=n;i++)
stt.insert({ord[i], i});
for (int i=1;i<=q;i++){
int t, v, lst;
cin>>t>>v;
if (t == 2){
int up = get(st[v]) - 1;
for (int i=0;i<=17;i++){
if ((1<<i) & up)
v = Par[v][i];
}
cout<<up<<'\n';
Add(st[v], -1); Add(st[v] + ch[v], 1);
stt.insert({ord[v], v});
continue;
}
while (v--){
auto [o, u] = *stt.begin();
stt.erase(begin(stt));
lst = u;
Add(st[u], 1); Add(st[u] + ch[u], -1);
}
cout<<lst<<'\n';
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |