Pagini recente » Cod sursa (job #3227069) | Cod sursa (job #1547825) | Cod sursa (job #1552379) | Cod sursa (job #183072) | Cod sursa (job #1356827)
#include <fstream>
#include <algorithm>
using namespace std;
const int nmax = 100001, logmax = 18;
int A[nmax], D[nmax][logmax], N, Q, loga2[nmax];
void build() {
loga2[1] = 0;
for (int i = 2; i <= N; i++)
loga2[i] = loga2[i / 2] + 1;
for (int i = 0; i < N; i++)
D[i][0] = i;
for (int j = 1; (1 << j) <= N; j++)
for (int i = 0; i + (1 << j) - 1 < N; i++)
if (A[D[i][j - 1]] < A[D[i + (1 << (j - 1))][j - 1]]) D[i][j] = D[i][j - 1];
else D[i][j] = D[i + (1 << (j - 1))][j - 1];
}
int query(int i, int j) {
int k = loga2[j - i + 1];
if (A[D[i][k]] <= A[D[j - (1 << k) + 1][k]]) return D[i][k];
else return D[j - (1 << k) + 1][k];
}
int main () {
ifstream in ("rmq.in");
ofstream out ("rmq.out");
in >> N >> Q;
for (int i = 0; i < N; i++)
in >> A[i];
build();
int x, y;
for (int i = 0; i < Q; i++) {
in >> x >> y;
out << A[query(x - 1, y - 1)] << endl;
}
in.close();
out.close();
return 0;
}