社区讨论
线段树能过?
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 条回复,欢迎继续交流。
正在加载回复...