Cod sursa(job #4649)

Utilizator vmaneavmanea vmanea Data 5 ianuarie 2007 23:51:50
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <fstream.h>

void df(unsigned);

unsigned cauta(unsigned, unsigned);

unsigned N,M,i,S[250005][22],STR[250000],Q,P,pt,j;

ifstream fin("stramosi.in");

ofstream fout("stramosi.out");

int main()

{

 fin>>N>>M;

 for (i=1;i<=N;i++)

  fin>>S[i][0];


 for (i=1;i<=N;i++)

  if (STR[i]==0)

  {

   STR[i]=1;

   df(i);

  }

 for (i=1;i<=M;i++)

 {

  fin>>P>>Q; // al Q-lea stramos al lui P

  fout<<cauta(P,Q)<<'\n';

 }

 fout.close();

 return 0;

}

void df(unsigned maimuta)

{

 int i;

 if (S[maimuta][0]==0)

  return;

 if (!STR[S[maimuta][0]])

 {

  STR[S[maimuta][0]]=1;

  df(S[maimuta][0]);

 }

 for (i=1;S[S[maimuta][i-1]][i-1];i++)

  S[maimuta][i]=S[S[maimuta][i-1]][i-1];

}

unsigned cauta(unsigned p, unsigned q)

{

 if (!q || p==0) return p;

 // al q-lea stramos al lui p

 for (j=0,pt=1;pt<q;pt<<=1,j++);

 if (pt>q) { j--; pt>>=1; }

 return cauta(S[p][j], q-pt);

}