题目:
解题思路:
很普通的RMQ
求出区间的最大值和最小值就好了
源程序:
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int maxf[50005][20],minf[50005][20];
void RMQ(int n)
{
for(int j=1;j<=20;j++)
{
for(int i=1;i<=n;i++)
{
if(i+(1<<j)-1<=n)
{
maxf[i][j]=max(maxf[i][j-1],maxf[i+(1<<(j-1))][j-1]);
minf[i][j]=min(minf[i][j-1],minf[i+(1<<(j-1))][j-1]);
}
}
}
}
int main()
{
int num,query;
int a,b;
while(scanf("%d%d",&num,&query)!=EOF)
{
for(int i=1;i<=num;i++)
{
scanf("%d",&maxf[i][0]);
minf[i][0]=maxf[i][0];
}
RMQ(num);
while(query--)
{
scanf("%d%d",&a,&b);
int k=(int)(log(b-a+1.0)/log(2.0));
int maxx=max(maxf[a][k],maxf[b-(1<<k)+1][k]);
int minn=min(minf[a][k],minf[b-(1<<k)+1][k]);
printf("%d\n",maxx-minn);
}
}
return 0;
}