#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std ;
const int N = 50000 + 11 ;
int fmin[N][30] , fmax[N][30] ;
int n , m ;
void init() {
for(int i = 1 ; i<= n ; ++i) {
scanf("%d" ,&fmax[i][0]) ;
fmin[i][0] = fmax[i][0] ;
}
for(int i = 1 ; (1<<i) <= n ; ++i) {//第一個數會用到可能等於n的長度
for(int j = 1 ; j+(1<<i)-1 <= n ; ++j) {//如果下標從0開始,這裏是小於
fmax[j][i] = max(fmax[j][i-1] , fmax[j+(1<<(i-1))][i-1]) ;
fmin[j][i] = min(fmin[j][i-1] , fmin[j+(1<<(i-1))][i-1]) ;
}
}
}
void query(int l , int r) {
int k = 0 ;
while((1<<(k+1)) <= r-l+1) ++k ;
int a = max(fmax[l][k] , fmax[r-(1<<k)+1][k]) ;//這裏是r減去前面的長度,分成兩個可能有重疊的區間
int b = min(fmin[l][k] , fmin[r-(1<<k)+1][k]) ;
printf("%d\n" , a-b) ;
}
int main() {
while(scanf("%d%d" ,&n ,&m)==2) {
init() ;
int a , b ;
while(m--) {
scanf("%d%d" ,&a ,&b) ;
query(a , b) ;
}
}
}
POJ 3264 RMQ模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.