const int M=5e4+10;
const int inf=0x3f3f3f3f;
struct node{
int l,r;
int mxl,mxr,mx,sum;
int mid(){return (l+r)>>1;}
}tree[M<<2];
void push_up(int rt)
{
tree[rt].mxl=max(tree[rt<<1].mxl,tree[rt<<1].sum+tree[rt<<1|1].mxl);
tree[rt].mxr=max(tree[rt<<1|1].mxr,tree[rt<<1].mxr+tree[rt<<1|1].sum);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
tree[rt].mx=max(max(tree[rt<<1].mx,tree[rt<<1|1].mx),tree[rt<<1].mxr+tree[rt<<1|1].mxl);
}
void build(int l,int r,int rt)
{
tree[rt].l=l;
tree[rt].r=r;
if(l==r)
{
int temp;
scanf("%d",&temp);
tree[rt].mx=tree[rt].mxl=tree[rt].mxr=tree[rt].sum=temp;
return ;
}
int mid=tree[rt].mid();
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
push_up(rt);
}
void modify(int v,int pos,int rt)
{
if(tree[rt].l==pos && tree[rt].r==pos)
{
tree[rt].mx=tree[rt].mxl=tree[rt].mxr=tree[rt].sum=v;
return;
}
int mid=tree[rt].mid();
if(pos<=mid) modify(v,pos,rt<<1);
else modify(v,pos,rt<<1|1);
push_up(rt);
}
node query_max(int l,int r,int rt)
{
node ans;
if(l==tree[rt].l && tree[rt].r==r)
{
return tree[rt];
}
int mid=tree[rt].mid();
if(r<=mid) return query_max(l,r,rt<<1);
else if(l>mid) return query_max(l,r,rt<<1|1);
node L=query_max(l,mid,rt<<1),R=query_max(mid+1,r,rt<<1|1);
ans.mxl=max(L.mxl,L.sum+R.mxl);
ans.mxr=max(R.mxr,L.mxr+R.sum);
ans.mx=max(max(ans.mxl,ans.mxr),max(max(L.mx,R.mx),L.mxr+R.mxl));
return ans;
}
int main(){
int n;
cin>>n;
build(1,n,1);
int q,op,x,y,c;
cin>>q;
for(int i=1;i<=q;i++)
{
scanf("%d %d %d",&op,&x,&y);
if(op==0)
modify(y,x,1);
else
printf("%d\n",query_max(x,y,1).mx);
}
}