Pagini recente » Cod sursa (job #405224) | Cod sursa (job #2111303) | Cod sursa (job #914107) | Cod sursa (job #2873191) | Cod sursa (job #4655)
Cod sursa(job #4655)
#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[0][maimuta]])
{
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)
{
while (q && p)
{
for (j=0,pt=1;pt<q/2;pt<<=1,j++);
p=S[j][p]; q-=pt;
}
return p;
}