Cod sursa(job #2753938)

Utilizator MateiDorian123Nastase Matei MateiDorian123 Data 24 mai 2021 19:12:26
Problema Stramosi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>

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

const int NMAX = 25005;
const int LGMAX = 20;

int n, m;
int M[LGMAX][NMAX];
int lg[NMAX];


void precalculare(){

    lg[1]=0;
	for (int i = 2; i <= n; i ++)
		lg[i] = lg[i / 2] + 1; ///precalculare pentru logaritmi

    for(int i = 1; (1 << i) <= n; i ++)
        for(int j = 1; j <= n; j ++)
            M[i][j] = M[i - 1][M[i - 1][j]];

}


int query(int poz, int rang){

    int stramos = poz; /// plecam de la stramosul de rang 0 -> aceeasi persoana

    while(rang){

        int i = lg[rang]; /// i -> log2(rang) -> linia pe care ne uitam
        int pow2 = 1 << i;

        stramos = M[i][stramos];
        rang -= pow2;

    }

    return stramos;

}


int main()
{
    int x, y;

    fin>>n>>m;

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

    precalculare();

    for(int i = 1; i <= m; i ++){
        fin>>x>>y;
        fout<<query(x, y)<<"\n";
    }

    fin.close();
    fout.close();

    return 0;
}