Cod sursa(job #1799699)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 6 noiembrie 2016 17:45:00
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int Nmax = 250002, Lgmax = 18;

int n, m, q, p;
int str[Lgmax][Nmax], lg[Nmax];

void Read();
void Prep();

int main()
{
    Read();
    Prep();
    while (m)
    {
        m--;
        fin >> q >> p;
        for ( int i = 0;(1 << i) <= p; i++)
        {

            if ( ((1 << i) & p) == (1 << i) )
            {
                q = str[i][q];
            }
            if (q == 0)
                p = 0;
        }
        fout << q << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}
void Read()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; i++ )
        fin >> str[0][i];
}

void Prep()
{
    lg[1] = 0;
    lg[2] = 1;
    for ( int i = 3; i <= n; i++ )
        lg[i]  = lg[i/2] + 1;

    int N = lg[n];
    for ( int j = 1; j <= N; j++ )
        for ( int i = 1;  i <= n; i++ )
        {
            str[j][i] = str[j-1][str[j-1][i]];
        }
}