poj 3264 RMQ

时间:2021-07-05 17:35:18

直接写个RMQ就能过。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Maxn 60010
using namespace std;
int maxnum[Maxn][],minnum[Maxn][],n,Log[Maxn+];
int Log2(int x)
{
int num=;
x/=;
while(x)
{
num++;
x/=;
}
return num;
}
void RMQ()
{
int i,j;
for(j=;j<;j++)
for(i=;i<=n;i++)
if(i+(<<j)-<=n)
{
maxnum[i][j]=Max(maxnum[i][j-],maxnum[i+(<<(j-))][j-]);
minnum[i][j]=Min(minnum[i][j-],minnum[i+(<<(j-))][j-]);
}
}
int main()
{
int i,j,q,a,b;
for(i=;i<=;i++)
Log[i]=Log2(i);
while(scanf("%d%d",&n,&q)!=EOF)
{ for(i=;i<=n;i++)
{
scanf("%d",&a);
maxnum[i][]=minnum[i][]=a;
}
RMQ();
for(i=;i<=q;i++)
{
scanf("%d%d",&a,&b);
int k=Log[b-a+];
printf("%d\n",Max(maxnum[a][k],maxnum[b-(<<k)+][k])-Min(minnum[a][k],minnum[b-(<<k)+][k]));
}
}
return ;
}