Pagini recente » Cod sursa (job #2075815) | Cod sursa (job #1576484) | Cod sursa (job #1193350) | Cod sursa (job #337318) | Cod sursa (job #2641133)
#include <stdio.h>
using namespace std;
#define NMAX 250000
#define NRMAX 18 ///2^18=262144
int father[NRMAX+1][NMAX+1];
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 x,int nod){
int i,j;
for(j=0;j<=NRMAX;j++){
if(x&(1<<j)!=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
}
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;
}