Cod sursa(job #453855)

Utilizator nandoLicker Nandor nando Data 11 mai 2010 14:35:44
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

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

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* fin=fopen("stramosi.in","r");
	FILE* fout=fopen("stramosi.out","w");
	
	fscanf(fin,"%d %d\n",&n,&m);
	
	for(int i=1,t;i<=n;i++){
		fscanf(fin,"%d ",&t);
		arb[t].push_back(i);	
	}
	
	dfs(0);
		
	for(int i=1,nod,k;i<=m;i++){
		fscanf(fin,"%d %d\n",&nod,&k);
		fprintf(fout,"%d\n",query(nod,k));	
	}
	
	fclose(fin);
	fclose(fout);
	return 0;	
}