Pagini recente » Cod sursa (job #2397898) | Cod sursa (job #366424) | Cod sursa (job #2584465) | Cod sursa (job #3239989) | Cod sursa (job #1403399)
#include <cstdio>
#include <algorithm>
using namespace std;
int N, M, L;
int * v;
int ** dp;
inline int log2(int x)
{
int i = -1;
while (x)
{
x >>= 1;
i++;
}
return i;
}
void debug()
{
int i, j;
for (i = 0; i <= L; i++)
{
for (j = 1; j <= N-((1<<i)-1); j++)
printf("%d ", dp[i][j]);
printf("\n");
}
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int i, j;
int a, b;
int lungime, mijloc;
scanf("%d%d", &N, &M);
L = log2(N);
v = new int[N+5];
dp = new int * [L+5];
for (i = 1; i <= N; i++)
{
scanf("%d", &v[i]);
}
dp[0] = v;
for (i = 1; i <= L; i++)
{
dp[i] = new int [N+5];
for (j = 1; j <= N - ((1 << i)-1); j++)
dp[i][j] = min(dp[i-1][j], dp[i-1][j+i]);
}
for (i = 1; i <= M; i++)
{
scanf("%d%d", &a, &b);
lungime = b-a+1;
mijloc = a+(1<<log2(lungime))-1;
printf("%d\n", min(dp[log2(lungime)][a], dp[log2(lungime)][mijloc]));
}
return 0;
}