Pagini recente » Cod sursa (job #637704) | Cod sursa (job #3228682) | Cod sursa (job #319422) | Cod sursa (job #654722) | Cod sursa (job #990356)
Cod sursa(job #990356)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define Nmax 250052
vector <int> G[Nmax];
vector < pair<int,int> > query[Nmax];
int use[Nmax];
int stiva[Nmax];
int stramos[Nmax];
int solution[Nmax];
int N, M, vf;
void read()
{
ifstream f("stramosi.in");
f >> N >> M;
for ( int i = 1; i <= N; ++i )
{
f >> stramos[i];
if ( stramos[i] )
G[ stramos[i] ].push_back( i );
}
for ( int i = 1; i <= M; ++i )
{
int P, Q;
f >> Q >> P;
query[Q].push_back( make_pair( P, i ) );
}
f.close();
}
void DFS( int nod )
{
stiva[ vf = 1 ] = nod;
while( vf )
{
int nod = stiva[vf];
for ( unsigned i = 0; i < query[nod].size(); ++i )
if( query[nod][i].first >= vf )
solution[ query[nod][i].second ] = 0;
else
solution[ query[nod][i].second ] = stiva[ vf - query[nod][i].first ];
if ( use[nod] == (int)G[nod].size() )
vf--;
else
{
int son = G[nod][ use[nod]++ ];
stiva[ ++vf ] = son;
}
}
}
void solve()
{
for ( int i = 1; i <= N; ++i )
if ( stramos[i] == 0 )
DFS( i );
}
void print()
{
ofstream g("stramosi.out");
for ( int i = 1; i <= M; ++i )
g << solution[i] << "\n";
g.close();
}
int main()
{
read();
solve();
print();
return 0;
}