Pagini recente » Cod sursa (job #79860) | Cod sursa (job #1248556) | Cod sursa (job #1450699) | Cod sursa (job #2237326) | Cod sursa (job #1635928)
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 250005
#define QMAX 300005
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
class Query {
public:
int val, pos;
};
vector <int> G[NMAX], stk;
vector <Query> query[QMAX], ans;
int father[NMAX], n, q;
bool used[NMAX];
inline bool cmp(Query a, Query b) {
return a.pos < b.pos;
}
void dfs(int node) {
used[node] = true;
stk.push_back(node);
for(auto qry: query[node]) {
ans.push_back({(stk.size() > qry.val) ? stk[stk.size() - qry.val - 1] : 0, qry.pos});
}
for(auto nxt: G[node]) {
if(used[nxt]) {
continue;
}
dfs(nxt);
stk.pop_back();
}
}
void offline() {
for(int i = 1; i <= q; ++i) {
int node, nr;
cin >> node >> nr;
query[node].push_back({nr, i});
}
dfs(0);
sort(ans.begin(), ans.end(), cmp);
for(auto it: ans) {
cout << it.val << '\n';
}
}
void online() {
}
int main() {
cin >> n >> q;
for(int i = 1; i <= n; ++i) {
cin >> father[i];
G[father[i]].push_back(i);
}
offline();
return 0;
}