Pagini recente » Cod sursa (job #2839566) | Cod sursa (job #1257640)
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
using namespace std;
#define NZ 250004
#define nr first
#define sol second
ifstream is ("stramosi.in");
ofstream os ("stramosi.out");
int N, M, stk[NZ], K, Qry[NZ+50000];
vector <int> G[NZ];
vector <int> :: iterator it;
vector <pair<int,int> > Q[NZ];
vector <pair<int,int> > :: iterator jt;
bitset <NZ> B, root;
stack <int> S;
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 t)
{
B[t] = 1;
stk[++K] = t;
if (Q[t].empty() == 0)
for (vector <pair<int,int> > :: iterator jt = Q[t].begin(); jt != Q[t].end(); ++jt)
{
if (K <= (*jt).nr) Qry[(*jt).sol] = 0;
else Qry[(*jt).sol] = stk[K-(*jt).nr];
}
for (vector <int> :: iterator it = G[t].begin(); it != G[t].end(); ++it)
if (B[*it] == 0)
DFS(*it);
--K;
};