#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define vi vector<int>
#define all(a) (a).begin(),(a).end()
#define lol 1000000007
#define endl '\n'
#define rep(i,a,b) for(int i=a;i<b;i++)
#define SIZE 50000
#define watch(x) cout << (#x) << " is " << (x) << endl
using namespace std;
void MOD( ll & x)
{
if ( x >= lol) x - = lol;
if ( x < 0 ) x + = lol;
}
struct segtree
{
ll maxsubsum;
ll sum;
ll maxprefsum;
ll maxsufsum;
} ;
//////////////////////////////////////
ll arr[ SIZE+ 5 ] ;
segtree tree[ 4 * SIZE+ 5 ] ; //arr and tree are both 1-indexed//
int n, q; //////////////////////////////////////
void build( int node, int start, int end)
{
if ( start > end)
return ;
if ( start== end)
{
tree[ node] .maxsubsum = arr[ start] ;
tree[ node] .sum = arr[ start] ;
tree[ node] .maxprefsum = arr[ start] ;
tree[ node] .maxsufsum = arr[ start] ;
}
else
{
int mid = ( start+ end) / 2 ;
build( 2 * node, start, mid) ;
build( 2 * node+ 1 , mid+ 1 , end) ;
//tree[node].sum=tree[node].maxprefsum=LLONG_MIN;
//tree[node].maxsufsum=tree[node].maxsubsum=LLONG_MIN;
tree[ node] .sum = tree[ 2 * node] .sum + tree[ 2 * node+ 1 ] .sum ;
tree[ node] .maxprefsum = max( tree[ 2 * node] .maxprefsum , tree[ 2 * node] .sum + tree[ 2 * node+ 1 ] .maxprefsum ) ;
tree[ node] .maxsufsum = max( tree[ 2 * node+ 1 ] .maxsufsum , tree[ 2 * node+ 1 ] .sum + tree[ 2 * node] .maxsufsum ) ;
tree[ node] .maxsubsum = max( tree[ 2 * node] .maxsubsum , max( tree[ 2 * node+ 1 ] .maxsubsum , tree[ 2 * node] .maxsufsum + tree[ 2 * node+ 1 ] .maxprefsum ) ) ; //CHANGES ACCORDING TO QUERY
}
}
segtree query( int node, int start, int end, int l, int r)
{
segtree result;
result.sum = result.maxprefsum = - 16000 ;
result.maxsufsum = result.maxsubsum = - 16000 ;
if ( start > end || r< start || end< l) //range of node is completely outside given range
{
return result;
}
if ( l<= start && end<= r) // range of node is completely inside given range
{
return tree[ node] ;
}
int mid = ( start+ end) / 2 ; //range of node is partially inside and partially outside the given range
if ( l > mid)
return query( 2 * node+ 1 , mid+ 1 , end, l, r) ;
if ( r <= mid)
return query( 2 * node, start, mid, l, r) ;
segtree p1 = query( 2 * node, start, mid, l, r) ;
segtree p2 = query( 2 * node+ 1 , mid+ 1 , end, l, r) ;
result.sum = p1.sum + p2.sum ;
result.maxprefsum = max( p1.maxprefsum , p1.sum + p2.maxprefsum ) ;
result.maxsufsum = max( p2.maxsufsum , p2.sum + p1.maxsufsum ) ;
result.maxsubsum = max( p1.maxsubsum , max( p2.maxsubsum , p1.maxsufsum + p2.maxprefsum ) ) ; //CHANGES ACCORDING TO QUERY
return result; //CHANGES ACCORDING TO QUERY
}
void solve( )
{
cin >> n;
rep( i,1 ,n+ 1 )
{
cin >> arr[ i] ;
// watch(arr[i]);
}
build( 1 ,1 ,n) ;
// cout << " build completed \n";
cin >> q;
// watch(q);
rep( i,1 ,q+ 1 )
{
int x, y;
cin >> x>> y;
// watch(x);
// watch(y);
// cout << "query entered\n";
segtree ans = query( 1 ,1 ,n,x,y) ;
// cout << "query finished\n";
cout << ans.maxsubsum << endl;
}
}
int main( )
{
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( 0 ) ;
cout .tie ( 0 ) ;
int t= 1 ;
// cin>>t;
while ( t-- ) {
solve( ) ;
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKI2RlZmluZSBsbCAgICAgICAgICBsb25nIGxvbmcKI2RlZmluZSBwYiAgICAgICAgICBwdXNoX2JhY2sKI2RlZmluZSBtcCAgICAgICAgICBtYWtlX3BhaXIKI2RlZmluZSBwaWkgICAgICAgICBwYWlyPGludCxpbnQ+CiNkZWZpbmUgdmkgICAgICAgICAgdmVjdG9yPGludD4KI2RlZmluZSBhbGwoYSkgICAgICAoYSkuYmVnaW4oKSwoYSkuZW5kKCkKI2RlZmluZSBsb2wgICAgICAgICAxMDAwMDAwMDA3CiNkZWZpbmUgZW5kbCAgICAgICAgJ1xuJwojZGVmaW5lIHJlcChpLGEsYikgIGZvcihpbnQgaT1hO2k8YjtpKyspCiNkZWZpbmUgU0laRSAgICAgICAgNTAwMDAKI2RlZmluZSB3YXRjaCh4KSBjb3V0IDw8ICgjeCkgPDwgIiBpcyAiIDw8ICh4KSA8PCBlbmRsCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIAogCnZvaWQgTU9EKGxsICZ4KQp7CiAgICBpZiAoeCA+PSBsb2wpIHggLT0gbG9sOwogICAgaWYgKHggPCAwKSB4ICs9IGxvbDsKfQogCiAKIApzdHJ1Y3Qgc2VndHJlZQp7CiAgICBsbCBtYXhzdWJzdW07CiAgICBsbCBzdW07CiAgICBsbCBtYXhwcmVmc3VtOwogICAgbGwgbWF4c3Vmc3VtOwp9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpsbCBhcnJbU0laRSs1XTsKc2VndHJlZSB0cmVlWzQqU0laRSs1XTsgICAgIC8vYXJyIGFuZCB0cmVlIGFyZSBib3RoIDEtaW5kZXhlZC8vCmludCBuLCBxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIAogCiAKdm9pZCBidWlsZChpbnQgbm9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kKQp7CiAgICBpZihzdGFydCA+IGVuZCkKICAgICAgICByZXR1cm47CiAgICBpZihzdGFydD09ZW5kKQogICAgewogICAgICAgIHRyZWVbbm9kZV0ubWF4c3Vic3VtID0gYXJyW3N0YXJ0XTsKICAgICAgICB0cmVlW25vZGVdLnN1bSA9IGFycltzdGFydF07CiAgICAgICAgdHJlZVtub2RlXS5tYXhwcmVmc3VtID0gYXJyW3N0YXJ0XTsKICAgICAgICB0cmVlW25vZGVdLm1heHN1ZnN1bSA9IGFycltzdGFydF07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CiAgICAgICAgYnVpbGQoMipub2RlLCBzdGFydCwgbWlkKTsKICAgICAgICBidWlsZCgyKm5vZGUrMSwgbWlkKzEsIGVuZCk7CiAgICAgICAKICAgICAgICAvL3RyZWVbbm9kZV0uc3VtPXRyZWVbbm9kZV0ubWF4cHJlZnN1bT1MTE9OR19NSU47CiAgICAgICAgLy90cmVlW25vZGVdLm1heHN1ZnN1bT10cmVlW25vZGVdLm1heHN1YnN1bT1MTE9OR19NSU47CiAgIAogICAgICAgIHRyZWVbbm9kZV0uc3VtID0gdHJlZVsyKm5vZGVdLnN1bSArIHRyZWVbMipub2RlKzFdLnN1bTsKICAgICAgICB0cmVlW25vZGVdLm1heHByZWZzdW0gPSBtYXgodHJlZVsyKm5vZGVdLm1heHByZWZzdW0sIHRyZWVbMipub2RlXS5zdW0gKyB0cmVlWzIqbm9kZSsxXS5tYXhwcmVmc3VtKTsKICAgICAgICB0cmVlW25vZGVdLm1heHN1ZnN1bSA9IG1heCh0cmVlWzIqbm9kZSsxXS5tYXhzdWZzdW0sIHRyZWVbMipub2RlKzFdLnN1bSArIHRyZWVbMipub2RlXS5tYXhzdWZzdW0pOwogICAgICAgIHRyZWVbbm9kZV0ubWF4c3Vic3VtID0gbWF4KHRyZWVbMipub2RlXS5tYXhzdWJzdW0gLCBtYXgodHJlZVsyKm5vZGUrMV0ubWF4c3Vic3VtLCB0cmVlWzIqbm9kZV0ubWF4c3Vmc3VtICsgdHJlZVsyKm5vZGUrMV0ubWF4cHJlZnN1bSkpOyAgICAgICAgIC8vQ0hBTkdFUyBBQ0NPUkRJTkcgVE8gUVVFUlkKICAgIH0KfQogCiAKIAogCiAKIApzZWd0cmVlIHF1ZXJ5KGludCBub2RlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBsLCBpbnQgcikKewogICAgc2VndHJlZSByZXN1bHQ7CiAgICByZXN1bHQuc3VtPXJlc3VsdC5tYXhwcmVmc3VtPSAtMTYwMDA7CiAgICByZXN1bHQubWF4c3Vmc3VtPXJlc3VsdC5tYXhzdWJzdW09IC0xNjAwMDsKICAgIGlmKHN0YXJ0ID4gZW5kIHx8IHI8c3RhcnQgfHwgZW5kPGwpICAgICAgICAvL3JhbmdlIG9mIG5vZGUgaXMgY29tcGxldGVseSBvdXRzaWRlIGdpdmVuIHJhbmdlCiAgICB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmKGw8PXN0YXJ0ICYmIGVuZDw9cikgICAgICAvLyByYW5nZSBvZiBub2RlIGlzIGNvbXBsZXRlbHkgaW5zaWRlIGdpdmVuIHJhbmdlCiAgICB7CiAgICAgICAgcmV0dXJuIHRyZWVbbm9kZV07CiAgICB9CiAKICAgIGludCBtaWQgPSAoc3RhcnQrZW5kKS8yOyAgICAgICAgLy9yYW5nZSBvZiBub2RlIGlzIHBhcnRpYWxseSBpbnNpZGUgYW5kIHBhcnRpYWxseSBvdXRzaWRlIHRoZSBnaXZlbiByYW5nZQogICAKICAgIGlmIChsID4gbWlkKQogICAgICByZXR1cm4gcXVlcnkoMipub2RlKzEsIG1pZCsxLCBlbmQsIGwsIHIpOwogICAgaWYgKHIgPD0gbWlkKQogICAgICByZXR1cm4gcXVlcnkoMipub2RlLCBzdGFydCwgbWlkLCBsLCByKTsKIAogICAKICAgIHNlZ3RyZWUgcDEgPSBxdWVyeSgyKm5vZGUsIHN0YXJ0LCBtaWQsIGwsIHIpOwogICAgc2VndHJlZSBwMiA9IHF1ZXJ5KDIqbm9kZSsxLCBtaWQrMSwgZW5kLCBsLCByKTsKIAogICAgcmVzdWx0LnN1bSA9IHAxLnN1bSArIHAyLnN1bTsKICAgIHJlc3VsdC5tYXhwcmVmc3VtID0gbWF4KHAxLm1heHByZWZzdW0sIHAxLnN1bSArIHAyLm1heHByZWZzdW0pOwogICAgcmVzdWx0Lm1heHN1ZnN1bSA9IG1heChwMi5tYXhzdWZzdW0sIHAyLnN1bSArIHAxLm1heHN1ZnN1bSk7CiAgICByZXN1bHQubWF4c3Vic3VtID0gbWF4KHAxLm1heHN1YnN1bSAsIG1heChwMi5tYXhzdWJzdW0sIHAxLm1heHN1ZnN1bSArIHAyLm1heHByZWZzdW0pKTsgICAgICAgICAvL0NIQU5HRVMgQUNDT1JESU5HIFRPIFFVRVJZCiAKICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgIC8vQ0hBTkdFUyBBQ0NPUkRJTkcgVE8gUVVFUlkKfQoKIAp2b2lkIHNvbHZlKCkKewogICAgY2luPj5uOwogICAgcmVwKGksMSxuKzEpCiAgICB7CiAgICAgICAgY2luPj5hcnJbaV07CiAgICAgICAgLy8gd2F0Y2goYXJyW2ldKTsKICAgIH0KICAgIGJ1aWxkKDEsMSxuKTsKICAgIC8vIGNvdXQgPDwgIiBidWlsZCBjb21wbGV0ZWQgIFxuIjsKICAgIGNpbj4+cTsKICAgIC8vIHdhdGNoKHEpOwEKICAgIHJlcChpLDEscSsxKQogICAgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGNpbj4+eD4+eTsKICAgICAgICAvLyB3YXRjaCh4KTsKICAgICAgICAvLyB3YXRjaCh5KTsKICAgICAgICAvLyBjb3V0IDw8ICJxdWVyeSBlbnRlcmVkXG4iOwogICAgICAgIHNlZ3RyZWUgYW5zID0gcXVlcnkoMSwxLG4seCx5KTsKICAgICAgICAvLyBjb3V0IDw8ICJxdWVyeSBmaW5pc2hlZFxuIjsKICAgICAgICBjb3V0PDxhbnMubWF4c3Vic3VtPDxlbmRsOwogICAgfQogCn0KIAogCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CiAgICBpbnQgdD0xOwogICAgLy8gY2luPj50OwogICAgd2hpbGUodC0tKXsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K