倍增-RMQ问题Sparse-Table算法

 
 

提示

code:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int n,m;
#define maxn 100008
int d[maxn][99];
int a[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++)d[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }
    }
    for(int i=1;i<=m;i++)
    {
        int k=0;
        int l,r;
        scanf("%d%d",&l,&r);
        while(1<<(k+1)<=(r-l+1))k++;
        printf("%d\n",max(d[l][k],d[r-(1<<k)+1][k]));
    }
    
    return 0;
}

 

 

posted @ 2019-07-13 09:03  lzylzy/kk  阅读(284)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end