Pagini recente » Cod sursa (job #1409614) | Cod sursa (job #2394094) | Cod sursa (job #979571) | Cod sursa (job #532809) | Cod sursa (job #1226104)
#include <cstdio>
#include <vector>
#define N 300001
using namespace std;
int n, m;
int parent[N];
vector<int> a[N];
struct nod {
int q, a;
nod(){};
nod(int _q, int _a) { q = _q; a = _a; }
};
vector<nod> A[N];
int node[N], question[N];
int stack[N], ns;
bool use[N];
int pos[N];
void dfs(int u) {
use[u] = true;
stack[ns++] = u;
int n = A[u].size();
for (int i = 0; i < n; ++i) {
int p = ns - A[u][i].q - 1;
if (p >= 0 && p < ns)
A[u][i].a = stack[p];
}
for (vector<int>::iterator it = a[u].begin(); it != a[u].end(); ++it)
if (!use[*it])
dfs(*it);
--ns;
}
int main() {
freopen ("stramosi.in", "r", stdin);
freopen ("stramosi.out", "w",stdout);
scanf ("%d %d\n", &n, &m);
int i;
for (i = 1; i <= n; ++i) {
scanf ("%d ", &parent[i]);
if (parent[i])
a[ parent[i] ].push_back(i);
}
for (i = 1; i <= m; ++i) {
scanf ("%d %d\n", &node[i], &question[i]);
A[ node[i] ].push_back( nod(question[i], 0) );
}
for (i = 1; i <= n; ++i)
if (!parent[i])
dfs(i);
for (i = 1; i <= m; ++i)
printf ("%d\n", A[ node[i] ][ pos[ node[i] ]++ ].a);
}