Pagini recente » Cod sursa (job #2006666) | Cod sursa (job #11694) | Cod sursa (job #1217140) | Cod sursa (job #1936793) | Cod sursa (job #2851415)
#include <bits/stdc++.h>
#define NMAX 100000
using namespace std;
ifstream fin("rmq.in"); ofstream fout("rmq.out");
vector<int> v;
vector<int> lg;
int look[NMAX][18];
int n, m;
void read() {
fin >> n >> m;
lg = vector<int>(n + 1), v = vector<int>(n + 1);
for(int i = 1; i <= n; i++)
fin >> v[i];
}
void precalc() {
lg[1] = 0;
for(int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
}
int query(int l, int r) {
int j = lg[r - l + 1];
return min(v[look[l][j]], v[look[r - (1 << j) + 1][j]]);
}
void init() {
for(int i = 1; i <= n; i++)
look[i][0] = i;
for(int j = 1; (1 << j) <= n; j++) {
for(int i = 1; i + (1 << j) - 1 <= n; i++) {
if(v[look[i][j - 1]] < v[look[i + (1 << (j - 1))][j - 1]])
look[i][j] = look[i][j - 1];
else
look[i][j] = look[i + (1 << (j - 1))][j - 1];
}
}
}
void rmq() {
init();
int l, r;
for(int i = 1; i <= m; i++)
fin >> l >> r, fout << query(l, r) << "\n";
}
int main()
{
read();
precalc();
rmq();
return 0;
}