Pagini recente » Cod sursa (job #750832) | Cod sursa (job #2983553) | Cod sursa (job #1633419) | Cod sursa (job #574089) | Cod sursa (job #2139314)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n, m;
int sir[20][100005];
//
//int log2(int x){
// int y = 1;
// int nr = 0;
//
// while(y < x){
// y <<= 1;
// nr++;
// }
//
// return nr - 1;
//}
void citire(){
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%d", &sir[0][i]);
}
}
void construire(){
int l = log2(n);
for(int i = 1; i <= l; i++){
for(int j = 0; j < n; j++){
sir[i][j] = sir[i - 1][j];
int x = j + (1 << (i - 1));
if(x < n){
sir[i][j] = min(sir[i][j], sir[i - 1][x]);
}
}
}
//
// for(int i = 0; i <= l; i++, printf("\n")){
// for(int j = 0; j < n; j++){
// printf("%d ", sir[i][j]);
// }
// }
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
citire();
construire();
for(int k = 0; k < m; k++){
int x, y;
scanf("%d %d", &x, &y);
x--;
y--;
int d = y - x + 1;
int l = log2(d);
int tmp1 = sir[l][x];
int tmp2 = sir[l][y - (1 << l) + 1];
// if(d == 1){
// tmp1 = tmp2 = sir[0][x];
// }
printf("%d\n", min(tmp1, tmp2));
}
return 0;
}