题解 P3865 【【模板】ST表】

· · 题解

这题。。。说好的“请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) “呢。。。

事实是一发线段树就可以了(额。。其实ST表还是更方便些的,我就是欠抽了想拿线段树卡过它),而且并不用zkw线段树,0.6s。。。

#include <iostream>
#include <cstdio>
using namespace std;
inline int read(void) {
    int x=0,f=1; char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
    for(;ch>='0'&&ch<='9';x=(x<<3)+(x<<1)+(ch^48),ch=getchar());
    return x*f;
}
const int maxn=4e5+9;
struct Tree {
    int l,r,mid,max;
}tree[maxn];
void build(int num, int l, int r) {
    tree[num].l=l,tree[num].r=r;
    tree[num].mid=(l+r)>>1;
    tree[num].max=-0x3f3f3f;
    if(l<r){
        build(num<<1,l,tree[num].mid);
        build(num<<1|1,tree[num].mid+1,r);
    }
}
void insert(int num, int cnt, int x) {
    tree[num].max=max(tree[num].max,x);
    if(tree[num].l!=tree[num].r){
        if(cnt<=tree[num].mid) insert(num<<1,cnt,x);
        else insert(num<<1|1,cnt,x);
    }
}
int query(int num, int l, int r) {
    if(l<=tree[num].l&&tree[num].r<=r)
        return tree[num].max;
    int maxx=-0x3f3f3f;
    if(l<=tree[num].mid) maxx=max(maxx,query(num<<1,l,r));
    if(tree[num].mid<r) maxx=max(maxx,query(num<<1|1,l,r));
    return maxx;
}
int main(int argc, char const *argv[]) {
    int n=read(),m=read();
    build(1,1,n);
    for(int i=1;i<=n;i++){
        int x=read(); insert(1,i,x);
    }
    for(int i=1;i<=m;i++){
        int l=read(),r=read();
        printf("%d\n",query(1,l,r));
    }
    return 0;
}