Pagini recente » Cod sursa (job #1794962) | Cod sursa (job #2405917) | Cod sursa (job #554105) | Cod sursa (job #2331868) | Cod sursa (job #2207790)
#include <iostream>
#include <fstream>
#include <math.h>
#include <cmath>
#define dMAX 100000
using namespace std;
int n, m;
int x, y;
int arr[dMAX + 2];
int sparseTable[dMAX][(int)log2(dMAX) + 1];
ifstream fin("rmq.in");
ofstream fout("rmq.out");
void MakeTable() {
int i, j;
for (j = 1; (1 << j) <= n; j++) {
for (i = 1; i + (1 << j) - 1 <= n; i++) {
if (arr[sparseTable[i][j - 1]] < arr[sparseTable[i + (1 << (j - 1))][j - 1]]) {
sparseTable[i][j] = sparseTable[i][j - 1];
} else
sparseTable[i][j] = sparseTable[i + (1 << (j - 1))][j - 1];
}
}
}
int RMQ(int low, int r) {
int l = r - low + 1;
int k = (int)log2(l);
return min(arr[sparseTable[low][k]], arr[sparseTable[low + l - (1 << k)][k]]);
}
int main()
{
int i, j;
fin >> n >> m;
for (i = 1; i <= n; i++) {
fin >> arr[i];
sparseTable[i][0] = i;
}
MakeTable();
for (i = 1; i <= m; i++) {
fin >> x >> y;
fout << RMQ(x, y) << '\n';
}
return 0;
}