POJ

ST表模版

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 50000+10
#define LOG 20
#define pii pair<int,int>
using namespace std;
int dmax[MAXN][LOG];
int dmin[MAXN][LOG];
int n;
int a[MAXN];
void init(){
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        dmax[i][0]=dmin[i][0]=a[i];
    }
    for(int j=1;j<LOG;j++){
        for(int i=1;i<=n;i++){
            if(i+(1<<j)-1>n){
                break;
            }
            dmax[i][j]=max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);
            dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
        }
    }    
}
int RMQ(int x,int y){
    int len=y-x+1;
    int k=(int)(log(1.0*len)/log(2));
    k=max(k-2,0);
    while((1<<(k+1))<=len)k++;
    int T1=max(dmax[x][k],dmax[y-(1<<k)+1][k]);
    int T2=min(dmin[x][k],dmin[y-(1<<k)+1][k]);
    return (T1-T2);
}
int main()
{
//    freopen("data.in","r",stdin);
    int T;
    scanf("%d%d",&n,&T);
    init();
    while(T--){
        int x,y;scanf("%d%d",&x,&y);
        printf("%d
",RMQ(x,y));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/w-h-h/p/7894892.html