基础数据结构----ST表

ST表

处理RMQ问题,即区间最值

用O(nlogn)预处理,O(1)查询最值

思想:倍增

maxx[i] [j] 表示从i位置开始的\(2^j\)个数字的最大值

板子

//#pragma comment(linker,   "/STACK:10240000000000,10240000000000")
//#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define For(i,a,b) for (int i=(a);i<=(b);++i)
#define Fod(i,b,a) for (int i=(b);i>=(a);--i)
#define mls multiset
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pob pop_back
#define itt iterator
#define clr(x) memset(x, 0, sizeof(x));

typedef long long ll;
typedef unsigned long long ull;
        
using namespace std;
const int MAXN = 0x7fffffff;
const int MOD = 1000000007;

inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int n, m;
int maxx[100005][25];
int quire(int l, int r)
{
    int k = log2(r - l + 1);
    return max(maxx[l][k], maxx[r + 1 - (1 << k)][k]);
}

int main ()
{   
    ios::sync_with_stdio(false);
    cin.tie(0);
    n = read();
    m = read();
    For(i, 1, n) maxx[i][0] = read();
    for(int j = 1; j <= 22; j++)
        for(int i = 1; i + (1 << j) - 1 <= n; i+
            maxx[i][j] = max(maxx[i][j-1], maxx[i + (1 << j - 1)][j-1]);
    while(m--)
    {
        int l = read();
        int r = read();
        printf("%d\n", quire(l, r));
    }
    return 0;
}   
posted @ 2021-11-04 20:15  Yra  阅读(140)  评论(0)    收藏  举报