Pagini recente » Cod sursa (job #2350103) | Cod sursa (job #1605423) | Cod sursa (job #636510) | Cod sursa (job #1529608) | Cod sursa (job #3291410)
#include <fstream>
#include <iostream>
#include <climits>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[50][110000];
int l;
int putm(int x) {
int p = 1, nr = 0;
while (x >= p) {
p = p * 2;
nr++;
}
return nr - 1;
}
void bdkinda() {
for (int i = 0; i < 21; i++)
for (int j = 0; j < 100005; j++)
a[i][j] = INT_MAX;
}
void genMat(int n) {
int jc = 1;
for (int i = 1; i < l; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = min(a[i - 1][j], a[i - 1][j + jc]);
}
jc *= 2;
}
}
int scrieM(int n) {
for (int i = 0; i < l; i++, cout << '\n') {
for (int j = 0; j < n; j++) {
cout << a[i][j] << ' ';
}
}
}
struct interval{
int start, finish;
};
int query(interval x) {
int pmin = putm(x.finish - x.start + 1);
return min(a[pmin][x.start], a[pmin][x.finish - pmin]);
}
int main()
{
int n, m;
fin >> n >> m;
l = putm(n);
l++;
bdkinda();
for (int i = 0; i < n; i++) {
fin >> a[0][i];
}
genMat(n);
scrieM(n);
for (int i = 0; i < m; i++) {
interval x;
fin >> x.start >> x.finish;
x.start--;
x.finish--;
fout << query(x) << '\n';
}
return 0;
}