Pagini recente » Cod sursa (job #1425917) | Cod sursa (job #1486481) | Cod sursa (job #1384821) | Cod sursa (job #2396490) | Cod sursa (job #596986)
Cod sursa(job #596986)
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 250003
#define QMAX 300003
#define pb push_back
#define mp make_pair
#define NrStramos first
#define NrQuery second
using namespace std;
ifstream citeste("stramosi.in");
ofstream scrie("stramosi.out");
vector< int > Arb[NMAX];
vector< pair< int, int > > QFiu[NMAX];
int N, Q, Sol[QMAX], i, Tata, Fiu, Cat, Cine, LantDF[NMAX];
bool Rad[NMAX];
inline void DF( int Nod, int Nivel )
{
LantDF[Nivel] = Nod;
for( vector< pair< int, int > >::iterator Qct = QFiu[Nod].begin(); Qct != QFiu[Nod].end(); Qct++ )
Sol[ (*Qct).NrQuery ] = ( (*Qct).NrStramos < Nivel ) ? LantDF[ Nivel - (*Qct).NrStramos ] : 0;
for( vector< int >::iterator F = Arb[Nod].begin(); F != Arb[Nod].end(); F++ )
DF( *F, Nivel+1 );
}
int main()
{
citeste >> N >> Q;
memset( Rad, false, sizeof(Rad) );
for( Fiu = 1; Fiu <= N; Fiu++ )
{
citeste >> Tata;
if ( Tata ) Arb[Tata].pb( Fiu );
else Rad[Fiu] = true;
}
for( i = 1; i <= Q; i++ )
{
citeste >> Cine >> Cat;
QFiu[Cine].pb( mp( Cat, i ) );
}
for( i = 1; i <= N; i++ )
if( Rad[i] )
DF( i, 1 );
for( i = 1; i <= Q; i++ )
scrie << Sol[i] << '\n';
return 0;
}