Pagini recente » Cod sursa (job #182609) | Cod sursa (job #2677991) | Cod sursa (job #2241118) | Cod sursa (job #1091090) | Cod sursa (job #1257654)
#include <fstream>
#include <vector>
using namespace std;
ifstream is ("stramosi.in");
ofstream os ("stramosi.out");
#define NZ 250004
#define MZ 300004
#define BUFFER 1<<17
char Pars[BUFFER], *p;
int GET();
void Check();
struct TP{
int nr, sol;
};
int N, M, stk[NZ], Qry[MZ];
bool root[NZ], B[NZ];
vector <int> G[NZ];
vector <TP> Q[NZ];
void DFS(int t)
{
vector <TP> :: iterator jt;
vector <int> :: iterator it;
stk[++stk[0]] = t;
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];
B[t] = 1;
for (it = G[t].begin(); it != G[t].end(); ++it)
if (B[*it] == 0)
DFS(*it);
--stk[0];
};
int main()
{
p = Pars;
N = GET(), M = GET();
for (int i = 1, a; i <= N; ++i)
{
a = GET();
if (a == 0) root[i] = 1;
else G[a].push_back(i);
}
TP ct;
for (int i = 1, nod; i <= M; ++i)
{
nod = GET();
ct.nr = GET();
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)
os << Qry[i] << '\n';
}
int GET()
{
while (*p < '0' || *p > '9') ++p, Check();
int X = 0;
while (*p >= '0' && *p <= '9') X = X*10 + (*p-'0'), ++p, Check();
return X;
};
void Check()
{
if (*p == '\0') is.get(Pars, BUFFER, '\0'), p = Pars;
};