Cod sursa(job #2434022)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 30 iunie 2019 12:51:58
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <fstream>
#define MAX (int)(25e4+5)
#define LOGMAX 20
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n,q,dp[LOGMAX][MAX],lg[MAX];

void read();
void solve();
int lsb(int&);

int main(){
    read();
    solve();
    return 0;
}
void solve(){
    int a,b,ancestor;
    while(q--){
        fin>>a>>b;
        ancestor=a;

        while(b){
            ancestor=dp[lg[lsb(b)]-1][ancestor];
            b-=lsb(b);
        }
        fout<<ancestor<<'\n';
    }
}
void read(){
    int i,j;
    fin>>n>>q;
    for(i=1;i<=n;++i)
        fin>>dp[0][i];
    ///precalculate
    for(i=1;i<=n;++i)
        lg[i]=lg[i/2]+1;

    for(i=1;i<LOGMAX;++i){
        for(j=1;j<=n;++j){
            dp[i][j]=dp[i-1][dp[i-1][j]];
        }
    }
}
int lsb(int& x){
    return x&(-x);
}