Cod sursa(job #988924)

Utilizator manutrutaEmanuel Truta manutruta Data 24 august 2013 12:18:22
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

#define MAXN 250005
#define BIT_MAX 32
typedef vector<int>::iterator iter;

//<parsare>
FILE* fin=fopen("stramosi.in","r");
const unsigned maxb=8192;
char buf[maxb];
unsigned ptr=maxb;

inline int getInt(){
    int nr=0,mul=1;
    while(buf[ptr]<'0'||'9'<buf[ptr]||buf[ptr]=='-'){
        if(buf[ptr]=='-'){
            mul=-1;
        }
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    }
    while('0'<=buf[ptr]&&buf[ptr]<='9'){
        nr=nr*10+buf[ptr]-'0';
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    }
    return nr*mul;
}
//</parsare>

vector<int> arb[MAXN];
int par[BIT_MAX][MAXN],stk[MAXN],sp=0,n,m;

void dfs(int nod){
    for(int i=1,cnt=0;cnt<BIT_MAX,i<=sp;i<<=1,cnt++){
        par[cnt][nod]=stk[sp-i];
    }
    stk[sp++]=nod;
    for(iter it=arb[nod].begin();it!=arb[nod].end();it++){
        dfs(*it);
    }
    sp--;
}

int query(int nod,int k){
    int lst=nod,b=0;
    do{
        if(k&1){
            lst=par[b][lst];
        }
        b++,k>>=1;
    }while(k && lst);
    return lst;
}

int main(){
    FILE* fout=fopen("stramosi.out","w");

    n = getInt();
    m = getInt();

    for(int i=1,t;i<=n;i++){
        t = getInt();
        arb[t].push_back(i);
    }

    dfs(0);

    for(int i=1,nod,k;i<=m;i++){
        nod = getInt();
        k = getInt();
        fprintf(fout,"%d\n",query(nod,k));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}