Pagini recente » Cod sursa (job #2024205) | Cod sursa (job #1008847) | Autentificare | Cod sursa (job #592961) | Cod sursa (job #1013036)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int A[100001];
//second size should be greater than log2(100000)
int rangeMinimum[100001][18];
int n,m;
void initRMQ() {
for (int i=0; i<n; i++){
rangeMinimum[i][0] = i;
}
for (int j = 1; (1 << j) <= n; j++){
for (int i=0; i<n; i++){
if (i + ((1<<j) - 1) < n){
if (A[rangeMinimum[i][j-1]] <= A[rangeMinimum[i + (1 << (j-1))][j-1]]){
rangeMinimum[i][j] = rangeMinimum[i][j-1];
} else {
rangeMinimum[i][j] = rangeMinimum[i + (1 << (j-1))][j-1];
}
}
}
}
}
int query(int i, int j) {
int k = (int) log2(j-i+1);
if (A[rangeMinimum[i][k]]
< A[rangeMinimum[j - (1<<k) + 1][k]]) {
return A[rangeMinimum[i][k]] ;
} else {
return A[rangeMinimum[j - (1<<k) + 1][k]];
}
return 0;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i=0; i<n; i++){
scanf("%d", &A[i]);
}
initRMQ();
int from, to;
for (int i=0; i<m; i++){
scanf("%d %d", &from, &to);
int minn = query(from-1, to-1);
printf("%d\n", minn);
}
return 0;
}