Pagini recente » Cod sursa (job #1844323) | Cod sursa (job #2899101) | Cod sursa (job #107042) | Cod sursa (job #953358) | Cod sursa (job #91379)
Cod sursa(job #91379)
#include<stdio.h>
int s[64][256000];
bool v[256000], t[256000];
int cd[512000];
void binary_df(int nod)
{
int nivel=1, i, j;
cd[nivel]=nod;
while(cd[nivel]!=0)
{
++nivel;
cd[nivel]=s[1][cd[nivel-1]];
}
--nivel;
for (i=1; i<=nivel; i++)
{
if (!t[cd[i]])
{
t[cd[i]]=1;
for (j=1; j<=nivel; j<<=1)
s[j][cd[i]]=cd[i+j];
}
}
}
int cauta(int A, int B)
{
int i;
for (i=0; (1<<i)<=B; i++)
{
if ((1<<i)==B)
{
return s[i+1][A];
}
}
return cauta(s[i][A], B-(1<<(i-1)) );
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
int n, m, i, A, B;
scanf("%d%d", &n, &m);
for (i=1; i<=n; i++)
{
scanf("%d", &s[1][i]);
v[s[1][i]]=1;
}
for (i=1; i<=n; i++)
if (!v[i])
{
binary_df(i);
}
for (i=1; i<=m; i++)
{
scanf("%d %d", &A, &B);
printf("%d\n", cauta(A, B));
}
int j;
for (i=1; i<=n; i++) //sparg linia de cache
{
printf("%d -> ", i);
for (j=1; j<=5; j++)
{
printf("%d ", s[j][i]);
}
printf("\n");
}
return 0;
}