Pagini recente » Cod sursa (job #1081555) | Cod sursa (job #2464220) | Cod sursa (job #2946234) | Cod sursa (job #674270) | Cod sursa (job #990357)
Cod sursa(job #990357)
#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 ] = nod;
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 ];
for ( unsigned i = 0; i < G[nod].size(); ++i )
DFS( G[nod][i] );
--vf;
}
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;
}