Cod sursa(job #4652)

Utilizator vmaneavmanea vmanea Data 5 ianuarie 2007 23:59:35
Problema Stramosi Scor 0
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[22][250005],STR[250005],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[0][i];


 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[0][maimuta]==0)

  return;

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

 {

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

  df(S[0][maimuta]);

 }

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

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

}

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[j][p], q-pt);

}