Pagini recente » Cod sursa (job #1248140) | Cod sursa (job #169223) | Cod sursa (job #3222973) | Cod sursa (job #2451220) | Cod sursa (job #520192)
Cod sursa(job #520192)
#include <cstdio>
#include <vector>
using namespace std;
int N, M, L;
vector< int > v;
vector< vector< int > > RMQ;
inline int min(int x, int y) { return x < y ? x : y; }
int getLog(int x) {
int rez = 0;
while ((1 << rez) < x) ++rez;
return rez;
}
void compute() {
L = getLog(N);
RMQ.assign(N, vector<int>(L, 0));
for (int i = 0; i < N; ++i)
RMQ[i][0] = i;
for (int l = 1; l < L; ++l)
for (int i = 0; i + (1 << l) <= N; ++i)
if (v[ RMQ[i][l-1]] < v[ RMQ[ i + (1 << (l-1)) ][l-1]])
RMQ[i][l] = RMQ[i][l-1];
else
RMQ[i][l] = RMQ[i + (1 << (l-1))][l-1];
}
int query(int a, int b) {
int L = getLog(b - a + 1) - 1;
return min(v[RMQ[a][L]], v[RMQ[b - (1 << L) + 1][L]]);
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d\n", &N, &M);
v.reserve(N);
for (int i = 0; i < N; ++i) {
int tmp;
scanf("%d\n", &tmp);
v.push_back(tmp);
}
compute();
while (M--) {
int a, b;
scanf("%d %d\n", &a, &b);
printf("%d\n", query(a-1,b-1) );
}
return 0;
}