Pagini recente » Cod sursa (job #2839587) | Cod sursa (job #3128371) | Cod sursa (job #187672) | Cod sursa (job #2565011) | Cod sursa (job #2207796)
#include <iostream>
#include <fstream>
#include <math.h>
#include <cmath>
#include <string.h>
#define dMAX 100000
using namespace std;
int n, m;
int x, y;
int arr[dMAX + 2];
int sparseTable[dMAX][(int)log2(dMAX) + 1];
char s[15];
int idx;
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]]);
}
void GetInt(int &t) {
t = 0;
while (isdigit(s[idx])) {
t *= 10;
t += (int)s[idx] - '0';
idx++;
}
idx++;
}
int main()
{
int i, j;
fin >> n >> m;
fin.get();
for (i = 1; i <= n; i++) {
fin.getline(s, 8);
idx = 0;
GetInt(arr[i]);
sparseTable[i][0] = i;
}
MakeTable();
for (i = 1; i <= m; i++) {
fin.getline(s, 15);
idx = 0;
GetInt(x);
GetInt(y);
fout << RMQ(x, y) << '\n';
}
return 0;
}