Pagini recente » Cod sursa (job #2763172) | Cod sursa (job #2101000) | Cod sursa (job #1085584) | Cod sursa (job #2412897) | Cod sursa (job #2622778)
#include <fstream>
#include <cmath>
#include <iostream>
using namespace std;
int lookup[100000][17];
int v[100000];
int n;
void preprocess(const int arr[]) {
for(int i = 0; i < n; i++) {
lookup[i][0] = i;
}
for(int j = 1; (1 << j) <= n; j++) {
for(int i = 0; i + (1 << j) - 1 < n; i++) {
if(arr[lookup[i][j - 1]] < arr[lookup[i + (1 << (j - 1))][j - 1]]) {
lookup[i][j] = lookup[i][j - 1];
} else {
lookup[i][j] = lookup[i + (1 << (j - 1))][j - 1];
}
}
}
}
int query(int arr[], int left, int right) {
int j = int(log2(right - left + 1));
if(arr[lookup[left][j]] <= arr[lookup[right - (1 << j) + 1][j]]) {
return arr[lookup[left][j]];
} else {
return arr[lookup[right - (1 << j) + 1][j]];
}
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int m, a, b;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++) {
scanf("%d", &v[i]);
}
preprocess(v);
for(int i = 0; i < m; i++) {
scanf("%d %d", &a, &b);
printf("%d\n", query(v, a - 1, b - 1));
}
}