Pagini recente » Cod sursa (job #995657) | Cod sursa (job #2449005) | Borderou de evaluare (job #1923363) | Cod sursa (job #863256) | Cod sursa (job #3323978)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
void dfs(int nod, vector<int> &st, vector<vector<int>> &adj,
vector<vector<pair<int, int>>> &op, vector<int> &ans) {
st.push_back(nod);
for (auto o: op[nod]) {
if (st.size() <= o.first) {
continue;
}
ans[o.second] = st[st.size() - o.first - 1];
}
for (auto i: adj[nod]) {
dfs(i, st, adj, op, ans);
}
st.pop_back();
}
int main() {
int n, q;
cin >> n >> q;
vector<vector<int>> adj(n + 5, vector<int>());
vector<int> roots;
for (int i = 1; i <= n; i++) {
int nod; cin >> nod;
if (nod != 0) {
adj[nod].push_back(i);
} else {
roots.push_back(i);
}
}
vector<vector<pair<int, int>>> op(n + 5, vector<pair<int, int>>());
vector<int> ans(q + 5, 0);
for (int i = 1; i <= q; i++) {
int nod, k; cin >> nod >> k;
op[nod].push_back({k, i});
}
vector<int> st;
for (auto root: roots) {
dfs(root, st, adj, op, ans);
}
for (int i = 1; i <= q; i++) {
cout << ans[i] << '\n';
}
}