//RMQ,求给定区间的最大值和最小值之差 #include<iostream> #include<cmath> using namespace std; int n,m,k,st,ed; int Max,Min; int _max[50010][17]; int _min[50010][17]; void RMQ_init()//RMQ初始化模板 { for(int j = 1;(1<<j) <= n;++j) { for(int i = 1;i + (1<<j) - 1<= n;++i) { _max[i][j] = max(_max[i][j-1],_max[i+(1<<(j-1))][j-1]); _min[i][j] = min(_min[i][j-1],_min[i+(1<<(j-1))][j-1]); } } } int RMQ(int st,int ed)//RMQ询问 { k = (int)(log((double)(ed - st + 1))/log(2.0)); Max = max(_max[st][k],_max[ed-(1<<k)+1][k]); Min = min(_min[st][k],_min[ed-(1<<k)+1][k]); return Max - Min; } int main() { //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(int i = 1;i <= n;++i) { scanf("%d",&_max[i][0]); _min[i][0] = _max[i][0]; } RMQ_init(); for(int i = 1;i <= m;++i) { scanf("%d%d",&st,&ed); printf("%d/n",RMQ(st,ed)); } return 0; }