Pagini recente » Cod sursa (job #3194102) | Cod sursa (job #2924789) | Istoria paginii propuneri/6-arhiva-educationala | Cod sursa (job #3185011) | Cod sursa (job #523378)
Cod sursa(job #523378)
#include <fstream>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
const int NMAX = 100001;
const int LGMAX = 17;
int mat[LGMAX][NMAX];
int main() {
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n, m;
scanf("%d %d", &n, &m);
for (int i=0; i<n; i++) scanf("%d", &mat[0][i]);
for (int i=1, p2=1; i<LGMAX; i++, p2*=2) {
for (int j=0; j<n; j++)
if (j + p2 < n) mat[i][j] = min(mat[i-1][j], mat[i-1][j+p2]);
else mat[i][j] = mat[i-1][j];
}
for (int i=0; i<m; i++) {
int left, right = 0;
scanf("%d %d", &left, &right);
left--; right--;
int rez = -1;
if (left == right)
rez = mat[0][left];
else {
int dist = right - left + 1;
int logg = ceil(log((double)dist)/log(2.0)) - 1;
rez = min(mat[logg][left], mat[logg][right-(1<<logg)+1]);
}
/*
int rezz = mat[0][left];
for (int j=left+1; j<=right; j++) {
rezz = min(rezz, mat[0][j]);
}
*/
printf("%d\n", rez);
}
return 0;
}