Pagini recente » Cod sursa (job #354327) | Cod sursa (job #2368106) | Cod sursa (job #3201521) | Cod sursa (job #862505) | Cod sursa (job #717928)
Cod sursa(job #717928)
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<algorithm>
using namespace std;
const int knmax = 100005;
int numbers, qrys, pows[knmax], rmq[20][knmax];
void read(){
assert(freopen("rmq.in", "r", stdin) != NULL);
scanf("%d%d", &numbers, &qrys);
for(int i = 1; i <= numbers; ++i)
scanf("%d", &rmq[0][i]);
}
void solve(){
int i, j;
for(j = 1; j <= 18; ++j)
for(i = 1; i <= numbers; ++i)
if(i + (1 << (j - 1)) > numbers)
rmq[j][i] = rmq[j - 1][i];
else
rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
for(i = 1, j = 0; i <= numbers; ++i){
if(i == 1 << (j + 1))
++j;
pows[i] = j;
}
}
inline int query(int left, int right){
int len = right - left + 1;
return min(rmq[pows[len]][left], rmq[pows[len]][right - (1 << pows[len]) + 1]);
}
void write(){
assert(freopen("rmq.out", "w", stdout) != NULL);
int i, aux_x, aux_y;
for(i = 1; i <= qrys; ++i){
scanf("%d%d", &aux_x, &aux_y);
printf("%d\n",query(aux_x, aux_y));
}
}
int main(){
read();
solve();
write();
return 0;
}