Cod sursa(job #2641133)

Utilizator anabatAna Batrineanu anabat Data 10 august 2020 11:46:08
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.87 kb
#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;
}