Pagini recente » Cod sursa (job #1712793) | Cod sursa (job #2162650) | Cod sursa (job #808028) | Cod sursa (job #2888763) | Cod sursa (job #2622774)
#include <fstream>
#include <cmath>
#include <iostream>
using namespace std;
int lookup[100000][17];
int v[100000];
int n;
struct Query {
int left;
int right;
};
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[], Query query) {
int j = int(log2(query.right - query.left + 1));
if(arr[lookup[query.left][j]] <= arr[lookup[query.right - (1 << j) + 1][j]]) {
return arr[lookup[query.left][j]];
} else {
return arr[lookup[query.right - (1 << j) + 1][j]];
}
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int m;
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++) {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", query(v, Query{a - 1, b - 1}));
}
}