#include using namespace std; ifstream cin("maxq.in"); ofstream cout("maxq.out"); typedef long long ll; const ll mxN = 2e5; ll sol , suf; struct node{ll totalSum,bigSum, prefix, suffix;}A[4*mxN+1]; void build(int node, int st, int dr) { if(st == dr) { int x; cin >> x; A[node] = {x,x,x,x}; return; } int mid = (st + dr) / 2; build(2*node,st,mid); build(2*node+1,mid+1,dr); A[node].totalSum = A[2*node].totalSum + A[2*node+1].totalSum; A[node].prefix = max(A[2*node].prefix , A[2*node].totalSum + A[2*node+1].prefix); A[node].suffix = max(A[2*node+1].suffix, A[2*node+1].totalSum + A[2*node].suffix); A[node].bigSum = max(A[2*node].bigSum, A[2*node+1].bigSum); A[node].bigSum = max(A[node].bigSum, A[2*node].suffix + A[2*node+1].prefix); } void update(int node,int st, int dr, int poz, int val) { if(st == dr) { A[node] = {val,val,val,val}; return; } int mid = (st + dr) / 2; if(poz <= mid) update(2*node,st,mid,poz,val); if(poz > mid) update(2*node+1,mid+1,dr,poz,val); A[node].totalSum = A[2*node].totalSum + A[2*node+1].totalSum; A[node].prefix = max(A[2*node].prefix , A[2*node].totalSum + A[2*node+1].prefix); A[node].suffix = max(A[2*node+1].suffix, A[2*node+1].totalSum + A[2*node].suffix); A[node].bigSum = max(A[2*node].bigSum, A[2*node+1].bigSum); A[node].bigSum = max(A[node].bigSum, A[2*node].suffix + A[2*node+1].prefix); } void query(int node, int st, int dr, int a, int b) { if(a <= st && dr <= b) { sol = max(sol, A[node].bigSum); sol = max(sol,suf + A[node].prefix); suf = max(A[node].suffix, A[node].totalSum + suf); return; } int mid = (st + dr) / 2; if(a <= mid) query(2*node,st,mid,a,b); if(b > mid) query(2*node+1,mid+1,dr,a,b); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; build(1,1,n); int m; cin >> m; for(int i = 1;i<=m;i++) { int op, a, b; cin >> op >> a >> b; if(op == 0) { a++; update(1,1,n,a,b); } if(op == 1) { a++, b++; sol = suf = -1e18; query(1,1,n,a,b); cout << max(sol,0LL) << '\n'; } } return 0; }