样例第一个输出不对
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
char ch = getchar();
while(!isdigit(ch) && ch != '-') ch = getchar();
ll X = 0 , f = 1;
if(ch == '-') f = -1 , ch = getchar();
while(isdigit(ch)) X = (X<<1)+(X<<3)+ch-'0' , ch = getchar();
return X*f;
}
const int N = 5e4+11;
struct SegmentTree{
int l,r;
int sum,dat,lmax,rmax;
#define ls(x) x<<1
#define rs(x) x<<1|1
}t[N<<2];
int n;
inline void push_up(int x){
t[x].sum = t[ls(x)].sum+t[rs(x)].sum;
t[x].lmax = max(t[ls(x)].lmax,t[ls(x)].sum+t[rs(x)].lmax);
t[x].rmax = max(t[rs(x)].rmax,t[rs(x)].sum+t[ls(x)].rmax);
t[x].dat = max(t[ls(x)].dat,max(t[rs(x)].dat,t[ls(x)].rmax+t[rs(x)].lmax));
}
void build(int p,int l,int r){
t[p].l = l; t[p].r = r;
if(l == r){
int c = read();
t[p].lmax=t[p].rmax=t[p].dat=t[p].sum=c;
return;
}
int mid = (l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void update(int p,int x,int c){
if(t[p].l == t[p].r){
t[p].lmax=t[p].rmax=t[p].dat=t[p].sum = c;
return;
}
int mid = (t[p].l+t[p].r)>>1;
if(x<=mid) update(ls(p),x,c);
else update(rs(p),x,c);
push_up(p);
}
int query(int p,int l,int r){
if(l <= t[p].l && r >= t[p].r) return t[p].dat;
int mid = (t[p].l+t[p].r)>>1 , val = -1e9;
if(l <= mid) val = max(val,query(ls(p),l,r));
if(r > mid) val = max(val,query(rs(p),l,r));
return val;
}
int main(){
n = read();
build(1,1,n);
int q = read();
while(q--){
int op = read(),
x = read(),
y = read();
if(op == 0){
update(1,x,y);
}else{
cout << query(1,x,y) << '\n';
}
}
return 0;
}