社区讨论

线段树能过?

P3865【模板】ST 表 & RMQ 问题参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhiysrqz
此快照首次捕获于
2025/11/03 17:55
4 个月前
此快照最后确认于
2025/11/03 17:55
4 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#define up(x,a,b) for(ll x=a;x<=b;++x)
#define down(x,a,b) for(ll x=a;x>=b;--x)
#define ls(i) i<<1
#define rs(i) i<<1|1
#ifdef __unix__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
using namespace std;
typedef int ll;
inline ll read(){
    ll x=0,f=1;
    char ch=gc();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=gc();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=gc();
    }
    return x*f;
}
inline void write(ll a){
    if(a<0){
        pc('-');
        a=-a;
    }
    if(a>9)
        write(a/10);
    pc(a%10+'0');
}
constexpr int N=1e5+10;
ll num[N];
struct node{
    ll l,r;
    ll Max;
}tree[N<<2];
inline void build(ll i,ll l,ll r){
    tree[i].l=l;
    tree[i].r=r;
    if(l==r){
        tree[i].Max=num[l];
        return;
    }
    build(ls(i),l,(ll)((l+r)>>1));
    build(rs(i),(ll)((l+r)>>1)+1,r);
    tree[i].Max=max(tree[ls(i)].Max,tree[rs(i)].Max);
}
inline ll range_Max(ll i,ll l,ll r){
    if(tree[i].l>=l&&tree[i].r<=r)
        return tree[i].Max;
    ll ans=0;
    if(tree[ls(i)].r>=l)
        ans=max(ans,range_Max(ls(i),l,r));
    if(tree[rs(i)].l<=r)
        ans=max(ans,range_Max(rs(i),l,r));
    return ans;
}
int main(){
    ll n=read(),m=read();
    up(i,1,n)
        num[i]=read();
    build(1,1,n);
    while(m--){
        ll l=read(),r=read();
        write(range_Max(1,l,r)),pc('\n');
    }
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...