模板——RMQ

就是模板

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
const int maxn=2000;
int mx[maxn][20],mi[maxn][20];
int a[maxn];
int n,m;
int rmq(int l,int r)
{
    int k=0;
    while(1<<k+1<=r-l+1)
        k++;
    int ans1=max(mx[l][k],mx[r-(1<<k)+1][k]);
    int ans2=min(mi[l][k],mi[r-(1<<k)+1][k]);
    return ans1-ans2;
}
void RMQ()
{
    for(int i=1;i<=n;i++)
        mi[i][0]=mx[i][0]=a[i];
    for(int j=1;1<<j<=n;j++)
        for(int i=1;i+(1<<j)<=n;i++)
            mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]),
            mi[i][j]=min(mi[i][j-1],mi[i+(1<<j-1)][j-1]);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    RMQ();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",rmq(x,y));
    }
    return 0;
}

 

posted @ 2016-11-17 21:15  [lemon]  阅读(210)  评论(0编辑  收藏  举报
……