Pagini recente » Cod sursa (job #2647091) | Cod sursa (job #2043133) | Cod sursa (job #2672613) | Cod sursa (job #366281) | Cod sursa (job #1388954)
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 250010, MAXM = 300010;
int N, M;
int st[MAXN];
vector<int> adj[MAXN], vf;
vector<bool> viz(MAXN, 0);
map<int, vector<int> > dp;
map<int, pair<int, int> > query;
map<pair<int, int>, int> sol;
void dfs(int u, int nivel = 0) {
st[nivel] = u;
viz[u] = true;
if (dp.find(u) != dp.end()) {
for (int a : dp[u]) {
sol[make_pair(u, a)] = st[nivel - a];
}
}
for (int v : adj[u]) {
if (!viz[v]) {
dfs(v, nivel + 1);
}
}
}
int main()
{
int t, Q, P;
ifstream f("stramosi.in");
freopen("stramosi.out", "w", stdout);
f >> N >> M;
for (int i = 1; i <= N; i++) {
f >> t;
if (t == 0) vf.push_back(i);
else adj[t].push_back(i);
}
for (int i = 0; i < M; i++) {
f >> P >> Q;
dp[P].push_back(Q);
query[i + 1] = make_pair(P, Q);
}
for (int x : vf) {
dfs(x);
}
for (int i = 1; i <= M; i++) {
cout << sol[query[i]] << '\n';
}
f.close();
return 0;
}