Cod sursa(job #739402)

Utilizator SteveStefan Eniceicu Steve Data 22 aprilie 2012 23:27:57
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <cmath>

using namespace std;

int N, M, a;
int v[20][250010];
int gata[250010];

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

void Citire ()
{
    fin >> N >> M;
    a = (int) log2 (N);
    for (int i = 1; i <= N; i++)
    {
        fin >> v[0][i];
        if (v[0][i] == 0)
        {
            gata[i] = 1;
            for (int j = 1; j <= a; j++)
            {
                v[j][i] = 0;
            }
        }
        else gata[i] = 0;
    }
}

void Initializare (int i)
{
    if (gata[i] == 1) return;
    Initializare (v[0][i]);
    for (int j = 1; j <= a; j++)
    {
        v[j][i] = v[j - 1][v[i][j - 1]];
    }
    gata[i] = 1;
}

void Business ()
{
    for (int i = 1; i <= N; i++)
    {
        Initializare (i);
    }
}

void Solve ()
{
    int Q, P, alfa;
    for (int k = 0; k < M; k++)
    {
        fin >> Q >> P;
        while (P > 0)
        {
            alfa = (int) log2 (P);
            Q = v[alfa][Q];
            P -= 1 << alfa;
        }
        fout << Q << "\n";
    }
    fin.close ();
    fout.close ();
}

int main ()
{
    Citire ();
    Business ();
    Solve ();
    return 0;
}