Cod sursa(job #990356)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 28 august 2013 00:13:03
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
}