Cod sursa(job #689828)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 24 februarie 2012 21:19:31
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <fstream>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");

#define NMAX 250010

int S[NMAX];
int A[NMAX*2];
int P[NMAX];
int NrStramos[NMAX];
int N, M;
int nr=0;

void parcurge(int e, int min)
{
    if (S[e] && !P[e]) parcurge(S[e], min);
    nr++;
    A[nr] = e;
    if (!P[e]) P[e] = nr, NrStramos[e] = nr - min - 1;
}

int pStramos(int x, int p)
{
    while (p){
        if (NrStramos[x]>=p) return A[P[x]-p];
        if (!NrStramos[A[P[x]-NrStramos[x]]]) return 0;
        x = A[P[x]-NrStramos[x]];
        p -= NrStramos[x];
    }
    return 0;
}

int main()
{
    int i, x, p;
    f >> N >> M;
    for (i=1; i<=N; i++) f >> S[i];
    for (i=N; i>0; i--)
        if (!P[i]) parcurge(i,nr);
    for (i=0; i<M; i++) {
        f >> x >> p;
        g << pStramos(x,p) << '\n';
    }
}