#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
int MAX[50000][20];
int MIN[50000][20];
void RMQ(int n)
{
for(int j=1;j<=20;j++)
{
for(int i=0;i<n;i++)
{
if(i+(1<<j)-1<n)
{
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 getmax(int l,int r)
{
int k=log2(r-l+1);
return max(MAX[l][k],MAX[r-(1<<k)+1][k]);
}
int getmin(int l,int r)
{
int k=log2(r-l+1);
return min(MIN[l][k],MIN[r-(1<<k)+1][k]);
}
int main()
{
int n,q;
while(~scanf("%d%d",&n,&q))
{
for(int i=0;i<n;i++)
{
scanf("%d",&MAX[i][0]);
MIN[i][0]=MAX[i][0];
}
RMQ(n);
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<n;j++)
// {
// printf("%d ",MAX[i][j]);
// }
// printf("\n");
// }
for(int i=0;i<q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",getmax(a-1,b-1)-getmin(a-1,b-1));
}
}
return 0;
}
RMQ详解来自某大牛:http://blog.csdn.net/liang5630/article/details/7917702