#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500001;
ll n,m;
ll a[N];
struct node
{
ll sum,lmax,rmax,dat;
}t[N*4],lft,rght,b;
ll cnt,x,y,k;
void build(ll node,ll l,ll r)
{
if(l==r)
{
t[node].sum=t[node].lmax=t[node].rmax=t[node].dat=a[l];
return;
}
ll mid=(l+r)>>1;
build(node*2+1,l,mid);
build(node*2+2,mid+1,r);
t[node].sum=t[node*2+1].sum+t[node*2+2].sum;
t[node].lmax=max(t[node*2+1].lmax,t[node*2+1].sum+t[node*2+2].lmax);
t[node].rmax=max(t[node*2+2].rmax,t[node*2+2].sum+t[node*2+1].rmax);
t[node].dat=max(max(t[node*2+1].dat,t[node*2+2].dat),t[node*2+1].rmax+t[node*2+2].lmax);
}
void change(ll node,ll l,ll r,ll x,ll y)
{
if(l==r)
{
a[l]=t[node].sum=t[node].lmax=t[node].rmax=t[node].dat=y;
return;
}
ll mid=(l+r)>>1;
if(x<=mid)
change(node*2+1,l,mid,x,y);
else
change(node*2+2,mid+1,r,x,y);
t[node].sum=t[node*2+1].sum+t[node*2+2].sum;
t[node].lmax=max(t[node*2+1].lmax,t[node*2+1].sum+t[node*2+2].lmax);
t[node].rmax=max(t[node*2+2].rmax,t[node*2+2].sum+t[node*2+1].rmax);
t[node].dat=max(max(t[node*2+1].dat,t[node*2+2].dat),t[node*2+1].rmax+t[node*2+2].lmax);
}
node summ(ll node,ll l,ll r,ll L,ll R)
{
if(l>=L&&r<=R)
return t[node];
ll mid=(l+r)>>1;
if(R<=mid)//整个区间在mid左边
return summ(node*2+1,l,mid,L,R);
if(L>mid)//整个区间在mid右边
return summ(node*2+2,mid+1,r,L,R);
lft=summ(node*2+1,l,mid,L,mid);
rght=summ(node*2+2,mid+1,r,mid+1,R);
b.sum=lft.sum+rght.sum;
b.lmax=max(lft.lmax,lft.sum+rght.lmax);
b.rmax=max(rght.rmax,rght.sum+lft.rmax);
b.dat=max(lft.rmax+rght.lmax,max(lft.dat,rght.dat));
return b;
}
int main()
{
scanf("%lld",&n);
ll i;
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(0,1,n);
scanf("%lld",&m);
for(i=1;i<=m;i++)
{
scanf("%lld",&cnt);
scanf("%lld%lld",&x,&y);
if(cnt==0)//change
change(0,1,n,x,y);
else//求和
printf("%lld\n",summ(0,1,n,x,y).dat);
}
return 0;
}