【模板】RMQ问题的ST解决

计蒜客

洛谷

【模板】

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 1e6+10;
int n, q, f[N][30];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void in()
{
    n = read();
    q = read();
    for(int i = 1; i <= n; i++)
        f[i][0] = read();
}
void init()
{
    for(int j = 1; (1<<j) <= n; j++)//(1<<j是长度)
        for(int i = 1; i+(1<<j)-1 <= n; i++)
            f[i][j] = max(f[i][j-1], f[i+(1<<(j-1))][j-1]);
}
int query(int l, int r)
{
    int len = log2(r-l+1);
    return max(f[l][len], f[r-(1<<len)+1][len]);
}
void solve()
{
    int l, r;
    while(q--)
    {
        l = read();
        r = read();
        printf("%d\n", query(l, r));
    }
}
int main()
{
    in();
    init();
    solve();
    return 0;
}
Code

 

posted @ 2021-04-09 20:13  bear_xin  阅读(47)  评论(0)    收藏  举报