Pagini recente » Cod sursa (job #1382038) | Cod sursa (job #3032159) | Istoria paginii runda/vacanta_11_4 | Cod sursa (job #2127748) | Cod sursa (job #770690)
Cod sursa(job #770690)
#include <stdio.h>
#include <cmath>
#define NMAX 100001
#define LIMIT 17
using namespace std;
int n, m;
int v[NMAX];
int PMin[NMAX][LIMIT];
void print_(int poz) {
printf("%d\n", v[poz]);
}
// Pozitia minimului;
int min(int p1, int p2) {
return (v[p1] < v[p2] ? p1 : p2);
}
void compute_rmq() {
for (int i = 1; i <= n; i++) {
PMin[i][0] = i;
}
for (int j = 1; j <= LIMIT; j++) {
int Lung_Interv = 1 << j;
for (int i = 1; i + Lung_Interv - 1 <= n; i++) {
PMin[i][j] = min(PMin[i][j - 1], PMin[i + (1 << (j - 1))][j - 1]);
}
}
}
int get_rmq(int x, int y) {
int k = (int)(floor(log2(y - x)));
return min(PMin[x][k], PMin[y - (1 << k) + 1][k]);
}
void solve_() {
int x, y;
for (int i = 0; i < m; i++) {
scanf("%d%d", &x, &y);
int poz = get_rmq(x, y);
print_(poz);
}
}
void read_() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
}
int main(){
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w" ,stdout);
read_();
compute_rmq();
solve_();
return 0;
}