Pagini recente » Cod sursa (job #364702) | Cod sursa (job #2676752) | Cod sursa (job #2914935) | Cod sursa (job #1049073) | Cod sursa (job #1225352)
#include <cstdio>
#include <vector>
#define N 300001
using namespace std;
int n, m;
int parent[N];
vector<int> a[N];
vector<pair<int, int> > 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;
for (vector<pair<int, int> > ::iterator it = A[u].begin(); it != A[u].end(); ++it) {
int p = ns - it->first - 1;
if (p >= 0 && p < ns)
it->second = 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( make_pair(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] ]++ ].second);
}