#include<unordered_map>
#include<unordered_set>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<cassert>
#include<numeric>
#include<vector>
#include<string>
#include<chrono>
#include<random>
#include<stack>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#include<ios>
using namespace std;
using ll = long long;
vector<vector<int>>gp,up;
vector<int>sub, srt, black, rev;
int qq = 0, n, sz=21;
bool cm(int& a, int& b) {
return sub[a] < sub[b];
}
void build(int u, int p) {
up[u][0] = p;
for (int i = 1; i < sz; i++) {
if (up[u][i - 1] == -1) break;
up[u][i] = up[up[u][i - 1]][i - 1];
}
for (int& v : gp[u]) {
if (v == p) continue;
build(v, u);
}
}
void dfs(int u, int p) {
for (int& v : gp[u]) {
if (v == p) continue;
dfs(v, u);
sub[v] = min(sub[v], sub[u]);
}
}
void make(int u, int p) {
for (int& v : gp[u]) {
if (v == p) continue;
make(v, u);
}
rev[u] = qq;
srt[qq++] = u + 1;
}
vector<int> get(int u) {
int res = 0;
for (int i = sz - 1; i >= 0; i--) {
if (up[u][i] == -1)continue;
if (black[up[u][i]]) {
u = up[u][i], res += (1 << i);
}
}
return { u,res };
}
void solve()
{
int q; cin >> n >> q;
int root = 0;
sub = srt = black = rev = vector<int>(n);
gp = vector<vector<int>>(n);
for (int i = 0; i < n; i++) {
int x; cin >> x;
if (x == 0) {
root = i;
continue;
}
gp[i].push_back(--x);
gp[x].push_back(i);
}
for (int i = 0; i < n; i++)sub[i] = i;
dfs(root, -1);
for (int i = 0; i < n; i++) sort(begin(gp[i]), end(gp[i]), cm);
make(root, -1);
set<pair<int, int>>st;
for (int i = 0; i < n; i++)st.insert({ i,srt[i] });
up = vector<vector<int>>(n, vector<int>(sz, -1));
build(root, -1);
while (q--) {
int t, k; cin >> t >> k;
if (t == 1) {
int res = 0;
while (k--) {
pair<int, int> ab = *st.begin();
st.erase(st.begin());
black[ab.second - 1] = true;
res = ab.second;
}
cout << res << endl;
continue;
}
vector<int>lavaxper = get(k - 1);
black[lavaxper[0]] = false;
st.insert({ rev[lavaxper[0]], lavaxper[0] + 1 });
cout << lavaxper[1] << endl;
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
//freopen("b3.in", "r", stdin);
//freopen("b3.out", "w", stdout);
//signed _; cin >> _; while (_--)
solve();
}
| # | 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... |