Cod sursa(job #1361002)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 25 februarie 2015 19:07:31
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#define DIM 250005

using namespace std;

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

int n, m, nod, rang;
int stramosi[20][DIM], pow[DIM];

int search(int rang, int nod){

    if(rang > n)
    {
        return 0;
    }

    if(rang == 0)
    {
        return nod;
    }
    return search(rang - (1 << pow[rang]), stramosi[pow[rang]][nod]);
}

void citire(){

    fin >> n >> m;

    for(int i = 1 ;i <= n; i ++)
    {
        fin >> stramosi[0][i];
    }

}

void solve(){

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

    pow[1] = 0;

    for(int i = 2; i <= n; i ++)
    {
        pow[i] = pow[i / 2] + 1;
    }

    for(int i = 1; i <= m; i ++)
    {
        fin >> nod >> rang;
        fout << search(rang, nod) << '\n';
    }
}

int main()
{
    citire();
    solve();
    return 0;
}