有交换 a,b,空间应该也开够了,求调。
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
const int M = N << 2;
int n, m, a[N];
int ans[M], lm[M], rm[M], sum[M];
struct node{
int res, lres, rres, sum;
};
#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)
void pushup(int o){
sum[o] = sum[ls(o)] + sum[rs(o)];
lm[o] = max(lm[ls(o)], sum[ls(o)] + lm[rs(o)]);
rm[o] = max(rm[rs(o)], sum[rs(o)] + rm[ls(o)]);
ans[o] = max(max(ans[ls(o)], ans[rs(o)]), rm[ls(o)] + lm[rs(o)]);
}
void build(int o, int l, int r){
if(l == r){
ans[o] = lm[o] = rm[o] = sum[o] = a[l];
return ;
}
int mid = (l + r) >> 1;
build(ls(o), l, mid);
build(rs(o), mid + 1, r);
pushup(o);
}
void update(int o, int l, int r, int p, int v){
if(l == r){
ans[o] = lm[o] = rm[o] = sum[o] = v;
return ;
}
int mid = (l + r) >> 1;
if(p <= mid)
update(ls(o), l, mid, p, v);
else
update(rs(o), mid + 1, r, p, v);
pushup(o);
}
node query(int o, int l, int r, int s, int t){
if(l == r)
return (node){ans[o], lm[o], rm[o], sum[o]};
int mid = (l + r) >> 1;
node now = (node){0, 0, 0, 0};
if(t <= mid)
return query(ls(o), l, mid, s, t);
if(s > mid)
return query(rs(o), mid + 1, r, s, t);
node p = query(ls(o), l, mid, s, t);
node q = query(rs(o), mid + 1, r, s, t);
now.sum = p.sum + q.sum;
now.lres = max(p.lres, p.sum + q.lres);
now.rres = max(q.rres, q.sum + p.rres);
now.res = max(max(p.res, q.res), p.rres + q.lres);
return now;
}
int main(){
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
build(1, 1, n);
while(m--){
int op, a, b;
scanf("%d%d%d", &op, &a, &b);
if(op == 1)
printf("%d\n", query(1, 1, n, min(a, b), max(a, b)).res);
else
update(1, 1, n, a, b);
}
return 0;
}