Pagini recente » Cod sursa (job #2724070) | Cod sursa (job #1923860) | Cod sursa (job #1716835) | Cod sursa (job #397102) | Cod sursa (job #1141792)
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define NMAX 100001
using namespace std;
int mat[NMAX][18];
int lg[NMAX];
int main() {
freopen ("rmq.in", "r", stdin);
freopen ("rmq.out", "w", stdout);
int N, M, i, j, v[NMAX], x, y;
scanf ("%d %d", &N, &M);
for (i = 1; i <= N; ++i)
scanf ("%d", &v[i]);
++M;
for (i = 1; i <= N; ++i)
mat[i][0] = i;
lg[1] = 0;
for (i = 2; i <= N; ++i)
lg[i] = lg[i/2] + 1;
for (j = 1; 1<<j <= N; ++j)
for (i = 1; i + (1 << j) - 1 <= N; ++i)
if (v[mat[i][j - 1]] < v[mat[i + (1 << (j - 1))][j - 1]])
mat[i][j] = mat[i][j-1];
else mat[i][j] = mat[i + (1 <<(j-1))][j-1];
while (--M) {
scanf ("%d %d", &x, &y);
int k = lg[y - x + 1];
printf ("%d\n", min(v[mat[x][k]], v[mat[y - (1<<k) + 1][k]]));
}
return 0;
}