Pagini recente » Cod sursa (job #2141635) | Cod sursa (job #1312353) | Cod sursa (job #3189288) | Cod sursa (job #1131224) | Cod sursa (job #1257636)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
#define NZ 300004
#define nr first
#define sol second
ifstream is ("stramosi.in");
ofstream os ("stramosi.out");
int N, M, stk[NZ], K, Qry[NZ];
vector <int> G[NZ];
vector <pair<int,int> > Q[NZ];
bitset <NZ> B, root;
void DFS(int x);
int main()
{
is >> N >> M;
for (int i = 1, a; i <= N; ++i)
{
is >> a;
if (a == 0) root[i] = 1;
else G[a].push_back(i);
}
for (int i = 1, nod, tr; i <= M; ++i)
{
is >> nod >> tr;
Q[nod].push_back({tr, i});
}
for (int i = 1; i <= N; ++i)
if (root[i])
DFS(i);
for (int i = 1; i <= M; ++i)
os << Qry[i] << '\n';
is.close();
os.close();
}
/*void DFS(int x)
{
bool NMN;
int i;
B[x] = 1;
stk[++K] = x;
while (K > 0)
{
NMN = 0;
i = stk[K];
if (Q[i].empty() == 0)
for (const auto& req : Q[i])
{
if (K <= req.nr) Qry[req.sol] = 0;
else Qry[req.sol] = stk[K-req.nr];
}
for (const auto& f : G[i])
if (B[f] == 0)
NMN = 1, B[f] = 1, stk[++K] = f;
if (NMN == 0)
--K;
}
};*/
void DFS(int t)
{
B[t] = 1;
stk[++K] = t;
if (Q[t].empty() == 0)
for (auto& req : Q[t])
{
if (K <= req.nr) Qry[req.sol] = 0;
else Qry[req.sol] = stk[K-req.nr];
}
for (auto& f : G[t])
if (B[f] == 0)
DFS(f);
--K;
};