#include <bits/stdc++.h>
using namespace std;
#define MAX 50001
#define ll long long int
#define IM INT_MAX
ll sum[MAX+1];
struct segment
{
ll pfx;
ll sfx;
ll best_sum;
};
segment query(segment *tree,ll index,ll s,ll e,ll qs,ll qe)
{
//3 cases
//1. no overlapping case
if(s>e||qs>e || qe<s)
{
//return infinity
segment ans;
ans.pfx=-IM;
ans.sfx=-IM;
ans.best_sum=-IM;
return ans;
}
//2.complete overlapping
if(s>=qs && e<=qe)
{
return tree[index];
}
//3. partial overlapping call both the sides
//splitting the range
ll mid=(s+e)/2;
segment left=query(tree,2*index,s,mid,qs,qe);
segment right=query(tree,2*index+1,mid+1,e,qs,qe);
segment res;
//pfx=max(left(pfx,left(sum)+right(pfx))
if(s==0)
res.pfx=max(left.pfx,sum[mid]+right.pfx);
else
res.pfx=max(left.pfx,sum[mid]-sum[s-1]+right.pfx);
//sfx=max(right(sfx),left(sfx)+right(sum))
res.sfx=max(right.sfx,sum[e]-sum[mid]+left.sfx);
//best=max(pfx(of that node),sfx(of that node),best left sum,best right sum,left(sfx)+right(pfx)
res.best_sum=max(max(left.best_sum,right.best_sum),left.sfx+right.pfx);
return res;
}
void update(segment *tree,ll index,ll s,ll e,ll pos,ll value)
{
//no overlap
if(pos <s || pos >e)
return;
//complete overlap
//leaf node
if(s==e)
{
tree[index].pfx=value;
tree[index].sfx=value;
tree[index].best_sum=value;
return;
}
//partial overlap
int mid=(s+e)/2;
//left
update(tree,2*index,s,mid,pos,value);
//right
update(tree,2*index+1,mid+1,e,pos,value);
if(s==0)
tree[index].pfx=max(tree[2*index].pfx,sum[mid]+tree[2*index+1].pfx);
else
tree[index].pfx=max(tree[2*index].pfx,sum[mid]-sum[s-1]+tree[2*index+1].pfx);
//sfx=max(right(sfx),left(sfx)+right(sum))
tree[index].sfx=max(tree[2*index+1].sfx,sum[e]-sum[mid]+tree[2*index].sfx);
//best=max(pfx(of that node),sfx(of that node),best left sum,best right sum,left(sfx)+right(pfx)
tree[index].best_sum=max(max(tree[2*index].best_sum,tree[2*index+1].best_sum),tree[2*index].sfx+tree[2*index+1].pfx);
}
void buildtree(segment *tree,ll *a,ll index,ll s,ll e)
{
//tree is build bottom up
if(s>e)
return;
//filling the leaf nodes
if(s==e)
{
tree[index].pfx=a[s];
tree[index].sfx=a[s];
tree[index].best_sum=a[s];
return;
}
ll mid=(s+e)/2;
//left tree
buildtree(tree,a,2*index,s,mid);
//right tree
buildtree(tree,a,2*index+1,mid+1,e);
//pfx=max(left(pfx,left(sum)+right(pfx))
if(s==0)
tree[index].pfx=max(tree[2*index].pfx,sum[mid]+tree[2*index+1].pfx);
else
tree[index].pfx=max(tree[2*index].pfx,sum[mid]-sum[s-1]+tree[2*index+1].pfx);
//sfx=max(right(sfx),left(sfx)+right(sum))
tree[index].sfx=max(tree[2*index+1].sfx,sum[e]-sum[mid]+tree[2*index].sfx);
//best=max(pfx(of that node),sfx(of that node),best left sum,best right sum,left(sfx)+right(pfx)
tree[index].best_sum=max(max(tree[2*index].best_sum,tree[2*index+1].best_sum),tree[2*index].sfx+tree[2*index+1].pfx);
}
int main()
{
ll n;
scanf("%lli",&n);
ll a[n];
for(ll i=0;i<n;i++)
{
scanf("%lli",&a[i]);
}
sum[0] = a[0];
for(ll i=1;i<n;i++)
sum[i] = a[i] +sum[i-1];
//allocating 4n+1 node size
segment *tree=new segment[4*n+1];
buildtree(tree,a,1,0,n-1);
ll m;
scanf("%lli",&m);
while(m--)
{
ll id,x,y;
scanf("%lli %lli %lli",&id,&x,&y);
if(id==1)
{
printf("%lli",query(tree,1,0,n-1,x-1,y-1).best_sum);
printf("\n");
}
if(id==0)
{
a[x-1]=y;
update(tree,1,0,n-1,x-1,y);
}
}
delete []tree;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTUFYIDUwMDAxCiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAojZGVmaW5lIElNIElOVF9NQVgKbGwgc3VtW01BWCsxXTsKc3RydWN0IHNlZ21lbnQKewoJbGwgcGZ4OwoJbGwgc2Z4OwoJbGwgYmVzdF9zdW07CgkKfTsKCnNlZ21lbnQgcXVlcnkoc2VnbWVudCAqdHJlZSxsbCBpbmRleCxsbCBzLGxsIGUsbGwgcXMsbGwgcWUpCnsKCS8vMyBjYXNlcwoKCS8vMS4gbm8gb3ZlcmxhcHBpbmcgY2FzZQoJaWYocz5lfHxxcz5lIHx8IHFlPHMpCgl7CgkJLy9yZXR1cm4gaW5maW5pdHkKCQlzZWdtZW50IGFuczsKCQlhbnMucGZ4PS1JTTsKCQlhbnMuc2Z4PS1JTTsKCQlhbnMuYmVzdF9zdW09LUlNOwoJCXJldHVybiBhbnM7Cgl9CgoJLy8yLmNvbXBsZXRlIG92ZXJsYXBwaW5nCgoJaWYocz49cXMgJiYgZTw9cWUpCgl7CgkJcmV0dXJuIHRyZWVbaW5kZXhdOwoJfQoKCS8vMy4gcGFydGlhbCBvdmVybGFwcGluZyBjYWxsIGJvdGggdGhlIHNpZGVzCgoJLy9zcGxpdHRpbmcgdGhlIHJhbmdlCglsbCBtaWQ9KHMrZSkvMjsKCglzZWdtZW50IGxlZnQ9cXVlcnkodHJlZSwyKmluZGV4LHMsbWlkLHFzLHFlKTsKCXNlZ21lbnQgcmlnaHQ9cXVlcnkodHJlZSwyKmluZGV4KzEsbWlkKzEsZSxxcyxxZSk7CgkKCXNlZ21lbnQgcmVzOwoJCgkvL3BmeD1tYXgobGVmdChwZngsbGVmdChzdW0pK3JpZ2h0KHBmeCkpCglpZihzPT0wKQoJcmVzLnBmeD1tYXgobGVmdC5wZngsc3VtW21pZF0rcmlnaHQucGZ4KTsKCWVsc2UKCXJlcy5wZng9bWF4KGxlZnQucGZ4LHN1bVttaWRdLXN1bVtzLTFdK3JpZ2h0LnBmeCk7CgkJCgkvL3NmeD1tYXgocmlnaHQoc2Z4KSxsZWZ0KHNmeCkrcmlnaHQoc3VtKSkKCXJlcy5zZng9bWF4KHJpZ2h0LnNmeCxzdW1bZV0tc3VtW21pZF0rbGVmdC5zZngpOwoJCgkvL2Jlc3Q9bWF4KHBmeChvZiB0aGF0IG5vZGUpLHNmeChvZiB0aGF0IG5vZGUpLGJlc3QgbGVmdCBzdW0sYmVzdCByaWdodCBzdW0sbGVmdChzZngpK3JpZ2h0KHBmeCkKCXJlcy5iZXN0X3N1bT1tYXgobWF4KGxlZnQuYmVzdF9zdW0scmlnaHQuYmVzdF9zdW0pLGxlZnQuc2Z4K3JpZ2h0LnBmeCk7CgkKCXJldHVybiByZXM7Cgp9Cgp2b2lkIHVwZGF0ZShzZWdtZW50ICp0cmVlLGxsIGluZGV4LGxsIHMsbGwgZSxsbCBwb3MsbGwgdmFsdWUpCnsKCQoJLy9ubyBvdmVybGFwCglpZihwb3MgPHMgfHwgcG9zID5lKQoJcmV0dXJuOwoJCgkvL2NvbXBsZXRlIG92ZXJsYXAKCS8vbGVhZiBub2RlCglpZihzPT1lKQoJewoJCXRyZWVbaW5kZXhdLnBmeD12YWx1ZTsKCQl0cmVlW2luZGV4XS5zZng9dmFsdWU7CgkJdHJlZVtpbmRleF0uYmVzdF9zdW09dmFsdWU7CgkJCgkJcmV0dXJuOwoJCQoJCQoJfQoJCgkvL3BhcnRpYWwgb3ZlcmxhcAoJaW50IG1pZD0ocytlKS8yOwoJCgkvL2xlZnQKCQoJdXBkYXRlKHRyZWUsMippbmRleCxzLG1pZCxwb3MsdmFsdWUpOwoJLy9yaWdodAoJCgl1cGRhdGUodHJlZSwyKmluZGV4KzEsbWlkKzEsZSxwb3MsdmFsdWUpOwoJCglpZihzPT0wKQoJdHJlZVtpbmRleF0ucGZ4PW1heCh0cmVlWzIqaW5kZXhdLnBmeCxzdW1bbWlkXSt0cmVlWzIqaW5kZXgrMV0ucGZ4KTsKCWVsc2UKCXRyZWVbaW5kZXhdLnBmeD1tYXgodHJlZVsyKmluZGV4XS5wZngsc3VtW21pZF0tc3VtW3MtMV0rdHJlZVsyKmluZGV4KzFdLnBmeCk7CgkJCgkvL3NmeD1tYXgocmlnaHQoc2Z4KSxsZWZ0KHNmeCkrcmlnaHQoc3VtKSkKCXRyZWVbaW5kZXhdLnNmeD1tYXgodHJlZVsyKmluZGV4KzFdLnNmeCxzdW1bZV0tc3VtW21pZF0rdHJlZVsyKmluZGV4XS5zZngpOwoJCgkvL2Jlc3Q9bWF4KHBmeChvZiB0aGF0IG5vZGUpLHNmeChvZiB0aGF0IG5vZGUpLGJlc3QgbGVmdCBzdW0sYmVzdCByaWdodCBzdW0sbGVmdChzZngpK3JpZ2h0KHBmeCkKCXRyZWVbaW5kZXhdLmJlc3Rfc3VtPW1heChtYXgodHJlZVsyKmluZGV4XS5iZXN0X3N1bSx0cmVlWzIqaW5kZXgrMV0uYmVzdF9zdW0pLHRyZWVbMippbmRleF0uc2Z4K3RyZWVbMippbmRleCsxXS5wZngpOwoJCn0KCnZvaWQgYnVpbGR0cmVlKHNlZ21lbnQgKnRyZWUsbGwgKmEsbGwgaW5kZXgsbGwgcyxsbCBlKQp7CgkvL3RyZWUgaXMgYnVpbGQgYm90dG9tIHVwCglpZihzPmUpCglyZXR1cm47CgoJLy9maWxsaW5nIHRoZSBsZWFmIG5vZGVzCglpZihzPT1lKQoJewoJCXRyZWVbaW5kZXhdLnBmeD1hW3NdOwoJCXRyZWVbaW5kZXhdLnNmeD1hW3NdOwoJCQoJCXRyZWVbaW5kZXhdLmJlc3Rfc3VtPWFbc107CgkJcmV0dXJuOwoJfQoKCWxsIG1pZD0ocytlKS8yOwoKCS8vbGVmdCB0cmVlCglidWlsZHRyZWUodHJlZSxhLDIqaW5kZXgscyxtaWQpOwoJLy9yaWdodCB0cmVlCglidWlsZHRyZWUodHJlZSxhLDIqaW5kZXgrMSxtaWQrMSxlKTsKCgkvL3BmeD1tYXgobGVmdChwZngsbGVmdChzdW0pK3JpZ2h0KHBmeCkpCglpZihzPT0wKQoJdHJlZVtpbmRleF0ucGZ4PW1heCh0cmVlWzIqaW5kZXhdLnBmeCxzdW1bbWlkXSt0cmVlWzIqaW5kZXgrMV0ucGZ4KTsKCWVsc2UKCXRyZWVbaW5kZXhdLnBmeD1tYXgodHJlZVsyKmluZGV4XS5wZngsc3VtW21pZF0tc3VtW3MtMV0rdHJlZVsyKmluZGV4KzFdLnBmeCk7CgkJCgkvL3NmeD1tYXgocmlnaHQoc2Z4KSxsZWZ0KHNmeCkrcmlnaHQoc3VtKSkKCXRyZWVbaW5kZXhdLnNmeD1tYXgodHJlZVsyKmluZGV4KzFdLnNmeCxzdW1bZV0tc3VtW21pZF0rdHJlZVsyKmluZGV4XS5zZngpOwoJCgkvL2Jlc3Q9bWF4KHBmeChvZiB0aGF0IG5vZGUpLHNmeChvZiB0aGF0IG5vZGUpLGJlc3QgbGVmdCBzdW0sYmVzdCByaWdodCBzdW0sbGVmdChzZngpK3JpZ2h0KHBmeCkKCXRyZWVbaW5kZXhdLmJlc3Rfc3VtPW1heChtYXgodHJlZVsyKmluZGV4XS5iZXN0X3N1bSx0cmVlWzIqaW5kZXgrMV0uYmVzdF9zdW0pLHRyZWVbMippbmRleF0uc2Z4K3RyZWVbMippbmRleCsxXS5wZngpOwoJCgoJCgkKCn0KaW50IG1haW4oKQp7CglsbCBuOwoJc2NhbmYoIiVsbGkiLCZuKTsKCWxsIGFbbl07Cglmb3IobGwgaT0wO2k8bjtpKyspCgl7CgkJc2NhbmYoIiVsbGkiLCZhW2ldKTsKCX0KCQogICAgICAgICAgc3VtWzBdID0gYVswXTsKICAgICAgICBmb3IobGwgaT0xO2k8bjtpKyspIAogICAgICAgICAgc3VtW2ldID0gYVtpXSArc3VtW2ktMV07CgkvL2FsbG9jYXRpbmcgNG4rMSBub2RlIHNpemUKCQoJc2VnbWVudCAqdHJlZT1uZXcgc2VnbWVudFs0Km4rMV07CgkKCgoJYnVpbGR0cmVlKHRyZWUsYSwxLDAsbi0xKTsKCQoJbGwgbTsKCXNjYW5mKCIlbGxpIiwmbSk7Cgl3aGlsZShtLS0pCgl7CgkJCglsbCBpZCx4LHk7CglzY2FuZigiJWxsaSAlbGxpICVsbGkiLCZpZCwmeCwmeSk7CglpZihpZD09MSkKCXsKCXByaW50ZigiJWxsaSIscXVlcnkodHJlZSwxLDAsbi0xLHgtMSx5LTEpLmJlc3Rfc3VtKTsKCXByaW50ZigiXG4iKTsKCX0KCWlmKGlkPT0wKQoJewoJCWFbeC0xXT15OwoJCXVwZGF0ZSh0cmVlLDEsMCxuLTEseC0xLHkpOwoJfQoJfQoJZGVsZXRlIFtddHJlZTsKCXJldHVybiAwOwp9Cg==