社区讨论
zkw线段树46pts求助
P4513小白逛公园参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lq7jp9rd
- 此快照首次捕获于
- 2023/12/16 12:15 2 年前
- 此快照最后确认于
- 2023/12/16 14:12 2 年前
C
#include <iostream>
using namespace std;
#define int long long
const int N = 5e5+10, inf = 1010;
struct Segment_Tree{ int m, l, r, s; } st[N<<4]; // s:all, m:max, l:lmax, r:rmax
inline Segment_Tree merge(Segment_Tree a, Segment_Tree b) {
return {
max(max(a.m, b.m), a.r+b.l),
max(a.l, a.s+b.l),
max(b.r, b.s+a.r),
a.s+b.s
};
}
#define le (u<<1)
#define ri (u<<1|1)
int n, m, tn, a[N];
inline void build() {
for(tn=1;tn<=n+1;tn<<=1);
for(int i=1;i<=n;++i) st[i+tn] = {a[i], a[i], a[i], a[i]};
for(int u=tn-1;u;--u) st[u]=merge(st[le], st[ri]);
}
inline void update(int u, int v) {
u+=tn, st[u] = {v, v, v, v};
for(u>>=1;u;u>>=1) st[u]=merge(st[le], st[ri]);
}
inline int query(int l, int r) {
Segment_Tree ansl = {-inf,-inf,-inf,-inf};
Segment_Tree ansr = {-inf,-inf,-inf,-inf};
for(l+=tn-1,r+=tn+1;l^r^1;l>>=1,r>>=1) {
if(~l&1) ansl = ansl.s==-inf?st[l^1]:merge(ansl, st[l^1]);
if(r&1) ansr = ansr.s==-inf?st[r^1]:merge(st[r^1], ansr);
}
if(ansl.s==-inf) return ansr.m;
if(ansr.s==-inf) return ansl.m;
return merge(ansl, ansr).m;
}
signed main() {
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
build();
while(m--) {
int k; cin>>k;
if(k==1) {
int a, b; cin>>a>>b;
if(a > b) swap(a, b);
cout<<query(a, b)<<"\n";
} else {
int p, s; cin>>p>>s;
update(p, s);
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...