【模板】ST表

传送门:洛谷-ST表


给定一个长度为 N N 的数列,和 M M 次询问,求出每一次询问的区间内数字的最大值。
1N105 1 ≤ N ≤ 10 5 , 1M106 1 ≤ M ≤ 10 6 , ai[0,109],1liriN a i ∈ [ 0 , 10 9 ] , 1 ≤ l i ≤ r i ≤ N

代码:

#include
#include
#include
#include
#include
using namespace std;
const int N=1e6+10;
int n,m;
int f[N][25],l,r,ans;

inline int max(int x,int y)
{
    return x>y? x:y;
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&f[i][0]);
    }
    int flor=(int)(log(n)/log(2))+1;
    for(int i=1;i<=flor+1;i++){
       int mx=n-(1<1;
       for(int j=1;j<=mx;j++){
          f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
       }
    }
    while(m--){
        scanf("%d%d",&l,&r);
        int len=(int)(log(r-l+1)/log(2));
        printf("%d\n",max(f[l][len],f[r-(1<<(len))+1][len]));
        //不需要考虑重叠 
        /*ans=f[l][len];l+=(1<
    }
    return 0;
}

你可能感兴趣的:(ST表)