Pagini recente » Cod sursa (job #3185011) | Cod sursa (job #523378) | Cod sursa (job #3212509) | IAP #6: Arhiva educationala | Cod sursa (job #523407)
Cod sursa(job #523407)
#include <fstream>
#include <iostream>
#include <string.h>
#include <math.h>
#include <vector>
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];
}
vector<int> lg2(n + 1);
lg2[1] = 0;
for (int i=2; i<=n; i++)
lg2[i] = lg2[i>>1] + 1;
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 = lg2[dist];
int 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 ", rezz);*/
printf("%d\n", rez);
}
return 0;
}