Pagini recente » Cod sursa (job #631879) | Cod sursa (job #1715288) | Cod sursa (job #798092) | Cod sursa (job #1026944) | Cod sursa (job #1257649)
#include <cstdio>
#include <vector>
using namespace std;
#define NZ 250004
struct TP{
int nr, sol;
};
int N, M, stk[NZ], Qry[NZ+50000];
vector <int> G[NZ];
vector <int> :: iterator it;
vector <TP> Q[NZ];
vector <TP> :: iterator jt;
bool root[NZ], B[NZ];
void DFS(int x);
int main()
{
freopen ("stramosi.in", "r", stdin);
freopen ("stramosi.out", "w", stdout);
scanf ("%d%d", &N, &M);
for (int i = 1, a; i <= N; ++i)
{
scanf("%d", &a);
if (a == 0) root[i] = 1;
else G[a].push_back(i);
}
TP ct;
for (int i = 1, nod; i <= M; ++i)
{
scanf("%d%d", &nod, &ct.nr);
ct.sol = i;
Q[nod].push_back(ct);
}
for (int i = 1; i <= N; ++i)
if (root[i])
DFS(i);
for (int i = 1; i <= M; ++i)
printf("%i\n", Qry[i]);
}
void DFS(int t)
{
vector <TP> :: iterator jt;
vector <int> :: iterator it;
B[t] = 1;
stk[++stk[0]] = t;
if (Q[t].empty() == 0)
for (jt = Q[t].begin(); jt != Q[t].end(); ++jt)
if (stk[0] <= (*jt).nr) Qry[(*jt).sol] = 0;
else Qry[(*jt).sol] = stk[stk[0]-(*jt).nr];
for (it = G[t].begin(); it != G[t].end(); ++it)
if (B[*it] == 0)
DFS(*it);
--stk[0];
};