Pagini recente » Cod sursa (job #2758018) | Cod sursa (job #2127806) | Diferente pentru problema/necromancer intre reviziile 3 si 2 | Cod sursa (job #2243963) | Cod sursa (job #2349468)
#include <stdio.h>
using namespace std;
int v[19][250005];
char chs[1000000];
int chs_poz = 1000000;
int parse_int()
{
int x = 0;
do
{
if(chs_poz >= 1000000)
{
chs_poz = 0;
int num;
num = fread(chs, 1, 1000000, stdin);
if(num == 0)
return -1;
}
x = x*10 + chs[chs_poz] - '0';
chs_poz++;
}
while(chs[chs_poz] >= '0' && chs[chs_poz] <= '9');
while(chs[chs_poz] < '0' || chs[chs_poz] > '9')
{
chs_poz++;
}
return x;
}
int get_lsb(int n)
{
return (n&(n-1))^n;
}
int get_logpow2(int n)
{
int p = 0;
while(n > 0)
{
p++;
n = n>>1;
}
return p;
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
int n, m, i, j, k, p, q, powk;
//scanf("%d%d", &n, &m);
n = parse_int();
m = parse_int();
for(i = 1; i <= n; i++)
{
//scanf("%d", &(v[1][i]));
v[1][i] = parse_int();
}
for(k = 2; 1<<k <= n; k++)
{
for(i = 1; i <= n; i++)
{
v[k][i] = v[k - 1][v[k - 1][i]];
}
}
if(1<<k > n)
k--;
powk = 1<<k;
int p_crt, anc, pas_pow;
for(i = 0; i < m; i++)
{
//scanf("%d%d", &q, &p);
q = parse_int();
p = parse_int();
anc = q;
while(p > 0)
{
p_crt = get_lsb(p);
p -= p_crt;
pas_pow = get_logpow2(p_crt);
anc = v[pas_pow][anc];
if(anc == 0)
break;
}
printf("%d\n", anc);
}
return 0;
}