#include <stdio.h>
#include <string.h>
#include <math.h>
#define M 50010
int mx[M][17],mi[M][17],d[M];
int n,t;
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void init()
{
int i,j,m;
for(i=1;i<=n;i++)
mi[i][0]=mx[i][0]=d[i];
m=(int)floor(log(1.0*n)/log(2.0));
for(i=1;i<=m;i++)
{
for(j=n;j>=1;j--)
{
mx[j][i]=mx[j][i-1];
if(j+(1<<(i-1))<=n)
mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
mi[j][i]=mi[j][i-1];
if(j+(1<<(i-1))<=n)
mi[j][i]=min(mi[j][i],mi[j+(1<<(i-1))][i-1]);
}
}
}
int rmq_max(int l,int r)
{
int m=(int)floor(log(1.0*(r-l+1))/log(2.0));
return max(mx[l][m],mx[r-(1<<m)+1][m]);
}
int rmq_min(int l,int r)
{
int m=(int)floor(log(1.0*(r-l+1))/log(2.0));
return min(mi[l][m],mi[r-(1<<m)+1][m]);
}
int main()
{
int i,l,r;
while(scanf("%d%d",&n,&t)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&d[i]);
init();
while(t--)
{
scanf("%d%d",&l,&r);
int ans=rmq_max(l,r)-rmq_min(l,r);
printf("%d\n",ans);
}
}
return 0;
}
rmq模板
最新推荐文章于 2022-03-26 21:08:54 发布