Pagini recente » Cod sursa (job #1275741) | Cod sursa (job #182455) | Cod sursa (job #1043399) | Rating Lupu Cezar Andrei (CezarLupu) | Cod sursa (job #790018)
Cod sursa(job #790018)
#include <cstdio>
int N, M;
int *S;
int p2[21];
int log2(int x)
{
int c = 0;
while(x)
{
c++;
x = x >> 1;
}
return c - 1;
}
void read()
{
scanf("%d%d\n", &N, &M);
S = new int[N + 1];
S[0] = 0;
for(int i = 1; i <= N; i++)
scanf("%d", S + i);
}
#define NECALCULAT -1
#define MAXN 250002
int mem[33][MAXN];
int f(int x, int i)
{
if(i == 0)
return S[x];
if(mem[i][x] != NECALCULAT)
return mem[i][x];
mem[i][x] = f(f(x, i - 1), i - 1);
return mem[i][x];
}
void pre()
{
p2[0] = 1;
for(int i = 1; i < 21; i++)
p2[i] = p2[i - 1] * 2;
for(int i = 0; i <= N; i++)
for(int j = 0; j < log2(M) + 1; j++)
mem[j][i] = NECALCULAT;
for(int i = 0; i <= N; i++)
for(int j = 0; j < log2(M) + 1; j++)
mem[j][i] = f(i, j);
}
int solve(int p, int q)
{
int u = p & (p - 1);
if(u == 0) // putere a lui 2
return mem[log2(p)][q];
return solve(u, mem[log2(p - u)][q]);
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
read();
pre();
int p, q;
while(M--)
{
scanf("%d%d", &q, &p);
printf("%d\n", solve(p, q));
}
return 0;
}