Cod sursa(job #1201070)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 24 iunie 2014 13:55:28
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
using namespace std;
#include <fstream>
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

const int Nmax = 250010;
const int logN = 18;

int m, n;
int s[logN][Nmax]; // s[i][j] - care este al 2^i -lea stramos al lui j

void preprocess() ;
int query(int, int) ;

int main()
{
    int i, P, Q;
    fin >> n >> m;
    for(i = 1; i <= n; ++i) fin >> s[0][i];
    preprocess();
    for(; m; --m)
    {
        fin >> Q >> P;
        fout << query(Q, P) << '\n';
    }
    /*for(i = 0; (1<<i) < n; ++i)
    {
        for(int j = 1; j <= n; ++j)
            fout << s[i][j] << ' ';
        fout << '\n';
    }*/
    return 0;
}


void preprocess()
{
    int i, j;
    for(i = 1; (1<<i) < n; ++i)
        for(j = 1; j <= n; ++j)
            s[i][j] = s[i-1][s[i-1][j]];
}


int query(int nod, int nr)
{
    //returneaza al nr -lea stramos al lui nod
    if(nr == 0) return nod;
    for(int bit = 0; nr && nod && bit < 20; ++bit)
        if(nr & (1<<bit))
            nod = s[bit][nod],
            nr -= (1<<bit);
    return nod;
}