考虑交换了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5 + 5;
ll n, m;
ll read() {
ll x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}
return x * f;
}
struct node {
ll sum, val, lv, rv;
node() { }
node(ll _sum, ll _val, ll _lv, ll _rv) {
sum = _sum, val = _val, lv = _lv, rv = _rv;
}
}f[N * 4];
void pushup(ll k, ll l, ll r) {
f[k].sum = f[k * 2].sum + f[k * 2 + 1].sum;
f[k].lv = max(f[k * 2].lv, f[k * 2].sum + f[k * 2 + 1].lv);
f[k].rv = max(f[k * 2 + 1].sum + f[k * 2].rv, f[k * 2 + 1].rv);
f[k].val = max(max(f[k * 2].sum, f[k * 2 + 1].sum)
, f[k * 2 + 1].lv + f[k * 2].rv);
}
ll a;
void build(ll k, ll l, ll r) {
if (l == r) {
a = read();
f[k].lv = f[k].rv = f[k].sum = f[k].val = a;
return;
}
ll mid = (l + r) >> 1;
build(k * 2, l, mid);
build(k * 2 + 1, mid + 1, r);
pushup(k, l, r);
}
void update(ll k, ll l, ll r, ll x, ll s) {
if (l == r && l == x) {
f[k].lv = f[k].rv = f[k].sum = f[k].val = s;
return;
}
ll mid = (l + r) >> 1;
if (x <= mid) update(k * 2, l, mid, x, s);
else update(k * 2 + 1, mid + 1, r, x, s);
pushup(k, l, r);
}
node ask(ll k, ll l, ll r, ll x, ll y) {
if (x <= l && r <= y) return f[k];
ll mid = (l + r) >> 1;
node u, v;
if (x <= mid) u = ask(k * 2, l, mid, x, y);
if (y > mid) v = ask(k * 2 + 1, mid + 1, r, x, y);
if (x <= mid) {
return u;
} else if (y > mid) {
return v;
} else {
ll sum = u.sum + v.sum;
ll lv = max(u.lv, u.sum + v.lv);
ll rv = max(v.sum + u.rv, v.rv);
ll val = max(max(u.sum, v.sum)
, v.lv + u.rv);
return node(sum, val, lv, rv);
}
}
int main() {
//freopen("P4513_2.in", "r", stdin);
//freopen("P4513.out", "w", stdout);
n = read(), m = read();
build(1, 1, n);
ll k, x, y, p, s;
while(m--) {
k = read();
if (k == 1) {
x = read(), y = read();
if (x > y) swap(x, y);
printf("%lld\n", ask(1, 1, n, x, y).val);
} else if (k == 2) {
p = read(), s = read();
update(1, 1, n, p, s);
}
}
return 0;
}
谢谢!