Pagini recente » Cod sursa (job #1723851) | Cod sursa (job #2242974) | Cod sursa (job #1526144) | Cod sursa (job #677231) | Cod sursa (job #820085)
Cod sursa(job #820085)
#include <iostream>
#include <fstream>
using namespace std;
#define MAX 100002
#define LOGMAX 18
long int log2[MAX];
long int rmq[MAX][LOGMAX];
long int nums[MAX];
long int n, m;
int main() {
freopen("rmq.in","r",stdin);
freopen("rmq.out", "w", stdout);
long int i, j;
scanf("%ld %ld", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%ld", &nums[i]);
// compute log table
log2[1] = log2[0] = 0;
for (i = 2; i <= n; i++)
log2[i] = log2[i/2]+1;
// preprocess rmq
for (i = 1; i <= n; i++)
rmq[i][0] = i; // intervals of length 2^0 = 1
for (j = 1; (1 << j) <= n; j++)
for (i = 1; i + (1 << j) - 1 <= n; i++) {
long int minSeg1 = rmq[i][j-1];
long int minSeg2 = rmq[i + (1 << (j-1))][j-1];
if (nums[minSeg1] < nums[minSeg2])
rmq[i][j] = minSeg1;
else
rmq[i][j] = minSeg2;
}
long int a, b;
for (i = 0; i < m; i++) {
scanf("%ld %ld", &a, &b);
// process query
long int k = log2[b - a + 1];
long int res = min(nums[rmq[a][k]],
nums[rmq[b - (1 << k) + 1][k]]);
printf("%ld\n", res);
}
return 0;
}