Pagini recente » Cod sursa (job #1056250) | Cod sursa (job #844068) | Cod sursa (job #2418123) | Cod sursa (job #624168) | Cod sursa (job #4649)
Cod sursa(job #4649)
#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);
}