Cod sursa(job #596986)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 20 iunie 2011 14:46:20
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#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;
}