Pagini recente » Cod sursa (job #1282438) | Cod sursa (job #2072420) | Cod sursa (job #836537) | Clasament dpg1 | Cod sursa (job #450834)
Cod sursa(job #450834)
/*
a[i][j] -> al 2^i-lea stramos al nr j
a[i][j] = a[i-1][ a[i-1][j] ]
Al 2^(i-1)-lea stramos al 2^(i-1)-lea stramos al nr x e al 2^(i-1)+2^(i-1) = 2^i lea stramos al nr x.
la interogari, impart cerinta in suma de puteri ale lui 2, a[x][a[y][a[z][x]]] pt n = 2^x + 2^y + 2^z.
*/
#include <cstdio>
const int L = 18;
const int N = 250001;
int a[L][N],n,m;
void citire()
{
scanf("%d%d",&n,&m);
for (int i = 1; i <= n; ++i)
scanf("%d",&a[0][i]);
}
int exponent_maxim_2 (int nr)
{
int x = 1<<L, p = L;
while (x > nr)
{
x >>= 1;
p -= 1;
}
return p;
}
void completare_a()
{
int l = exponent_maxim_2(n) + 1;
for (int i = 1; i <= l; ++i)
for (int j = 1; j <= n; ++j)
a[i][j] = a[i-1][ a[i-1][j] ];
}
int raspuns(int x, int nr)
{
if (nr == 0)
return x;
int i = 0;
while (1<<i <= nr)
++i;
--i;
while (i >= 0)
{
if (1<<i <= nr)
{
x = a[i][x];
nr -= 1<<i;
}
--i;
}
return x;
}
void raspundere()
{
int a,b;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",raspuns(a,b));
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
citire();
completare_a();
raspundere();
return 0;
}