Pagini recente » Cod sursa (job #523780) | Cod sursa (job #2816632) | Cod sursa (job #1755301) | Cod sursa (job #996591) | Cod sursa (job #4650)
Cod sursa(job #4650)
#include <fstream.h>
void df(unsigned);
unsigned cauta(unsigned, unsigned);
unsigned N,M,i,S[22][250005],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[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-1]];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);
}