Pagini recente » Borderou de evaluare (job #378889) | Cod sursa (job #1995354) | Cod sursa (job #636272) | Cod sursa (job #363372) | Cod sursa (job #2641838)
#include <stdio.h>
using namespace std;
#define NMAX 250000
#define NRMAX 20 ///2^18=262144
int father[NRMAX+1][NMAX+1];
//int p[NRMAX];
/*void prep(){ ///1<<j
int j;
p[0]=1;
for(j=1;j<NRMAX;j++){
p[j]=p[j-1]*2;
}
}*/
void precalc(int n){
int i,j;
for(j=1;j<NRMAX;j++){
for(i=1;i<=n;i++){
father[j][i]=father[j-1][father[j-1][i]];
}
}
}
int answer(int nod,int x){
int j;
for(j=0;(1<<j)<=x;j++){
if(((1<<j)&x)!=0) ///este puterea asta in nr?
nod=father[j][nod];
}
return nod; ///in nod avem al x lea tata
}
int main()
{
FILE *fin,*fout;
fin=fopen("stramosi.in","r");
fout=fopen("stramosi.out","w");
int n,m,i,j,x,y;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&father[0][i]); ///tatal direct al fiecaruia
}
///prep();
precalc(n);
for(i=1;i<=m;i++){
fscanf(fin,"%d%d",&x,&y);
fprintf(fout,"%d\n",answer(x,y));
}
fclose(fin);
fclose(fout);
return 0;
}