qwq孩子破防了,求条,样例的第二行输出7。思路按照https://www.luogu.com.cn/article/h5e8lcdu 这篇题解写的,但是代码和他写的不一样,拼尽全力无法战胜,在线认义父。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int a[N];
struct SegmentTree
{
struct node
{
int l, r, sum;
int ans, pre, suf;
}tr[N * 4];
void pushup(int u){
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
tr[u].ans = max(max(tr[u << 1].ans, tr[u].ans), max(tr[u << 1 | 1].ans, tr[u << 1].suf + tr[u << 1 | 1].pre));
tr[u].pre = max(tr[u << 1].pre, tr[u << 1].sum + tr[u << 1 | 1].pre);
tr[u].suf = max(tr[u << 1 | 1].suf, tr[u << 1 | 1].sum + tr[u << 1].suf);
}
void build(int u, int l, int r){
tr[u].l = l, tr[u].r = r; tr[u].sum = tr[u].pre = tr[u].ans = tr[u].suf = 0;
if(l == r){
tr[u].sum = tr[u].ans = tr[u].pre = tr[u].suf = a[l];
return;
}
int mid = (l + r) / 2;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
void update(int u, int x, int k){
if(tr[u].l == tr[u].r) {
tr[u].sum = tr[u].ans = tr[u].pre = tr[u].suf = k;
return ;
}
int mid = (tr[u].l + tr[u].r) / 2;
if(x <= mid) update(u << 1, x, k);
else update(u << 1 | 1, x, k);
pushup(u);
}
node query(int u, int l, int r){
if(l <= tr[u].l && tr[u].r <= r){
return tr[u];
}
int mid = (tr[u].l + tr[u].r) / 2;
if(l <= mid && r > mid){
node lson = query(u << 1, l, r);
node rson = query(u << 1 | 1, l, r), res;
res.sum = lson.sum + rson.sum;
res.ans = max(lson.ans, rson.ans);
res.ans = max(res.ans, lson.suf + rson.pre);
res.pre = max(lson.sum + rson.pre, lson.pre);
res.suf = max(rson.sum + lson.suf, rson.suf);
return res;
}
else {
if(l <= mid) return query(u << 1, l, r);
if(r > mid) return query(u << 1 | 1, l, r);
}
}
}seg;
int main()
{
int n; cin >> n;
for(int i = 1;i <= n;i ++ ) cin >> a[i];
seg.build(1, 1, n);
int q; cin >> q;
while(q -- ){
int k; cin >>k;
int l, r ; cin >> l >> r;
if(k == 0) seg.update(1, l, r);
else cout << seg.query(1, l, r).ans << endl;
}
return 0;
}