题目:我是超链接
题解:
一个RMQ的模板
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#define sz 31
using namespace std;
int maxx[50005][sz],minn[50005][sz],a[50005];
int main()
{
int n,q,i,j;
scanf("%d%d",&n,&q);
for (i=1;i<=n;i++) scanf("%d",&a[i]),maxx[i][0]=a[i],minn[i][0]=a[i];
for (j=1;j<sz;j++)
for (i=1;i<=n;i++)
if (i+(1<<j)-1<=n)
{
maxx[i][j]=max(maxx[i][j-1],maxx[i+(1<<(j-1))][j-1]);
minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);
}
while (q--)
{
int l,r;
scanf("%d%d",&l,&r);
if (l>r) swap(l,r);
int k=log2(r-l+1);
int Max=max(maxx[l][k],maxx[r-(1<<k)+1][k]);
int Min=min(minn[l][k],minn[r-(1<<k)+1][k]);
printf("%d\n",Max-Min);
}
}