Cod sursa(job #2641838)

Utilizator anabatAna Batrineanu anabat Data 12 august 2020 20:36:29
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#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;
}