#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;
}