Cod sursa(job #428680)

Utilizator hendrikHendrik Lai hendrik Data 29 martie 2010 14:32:23
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

void open(){
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
}

int n,m,par[250010][19],Q,P,now,x;

int log_2(int a){
    int i=1;
    for (;(1<<i)<=a;i++);
    return i-1;
}

void get_int(int &a){
    char c;
    while (c=getchar()){
        if (c>='0' && c<='9'){
            a=c-'0';
            break;
        }
    }
    while (c=getchar()){
        if (c>='0' && c<='9'){
            a=(a<<1)+(a<<3)+(c-'0');
        }
        else break;
    }
}

int main(){
    open();
    get_int(n);get_int(m);
    //scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
        get_int(par[i][0]);
        //scanf("%d",&par[i][0]);
    }
    for (int i=1;(1<<i)<=n;i++){
        for (int j=1;j<=n;j++){
            par[j][i]=par[par[j][i-1]][i-1];
        }
    }
    for (int i=0;i<m;i++){
        get_int(Q);get_int(P);
        //scanf("%d%d",&Q,&P);
        now=Q;
        for (int j=0;P;j++){
            if (P & (1<<j)){
                now=par[now][j];
                if (now==0) break;
                P&=~(1<<j);
            }
        }
        printf("%d\n",now);
    }
    //system("pause");
    return 0;
}