1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include<bits/stdc++.h> using namespace std; using ll=long long; const int N=500005;
#define int ll
struct Tree{ ll l,r; ll sum,lmax,lmin,rmax,rmin,ans; }tr[N*4];
ll n,q,a[N];
void pushup(Tree &a,Tree &b,Tree &c){ a.sum=b.sum+c.sum; a.lmax=max(b.lmax,b.sum+c.lmax); a.rmax=max(c.rmax,c.sum+b.rmax); a.lmin=min(b.lmin,b.sum+c.lmin); a.rmin=min(c.rmin,c.sum+b.rmin); a.ans=max(max(abs(b.ans),abs(c.ans)),max(abs(b.rmax+c.lmax),abs(b.rmin+c.lmin))); }
void pushup(int u){ pushup(tr[u],tr[u<<1],tr[u<<1|1]); }
Tree query(int u,int x,int y){ int l=tr[u].l,r=tr[u].r,mid=(l+r)/2; if(x<=l&&y>=r)return tr[u]; if(y<=mid)return query(u<<1,x,y); else if(x>mid)return query(u<<1|1,x,y); else{ auto b=query(u<<1,x,y); auto c=query(u<<1|1,x,y); Tree a; pushup(a,b,c); return a; } }
void build(int u,int l,int r){ if(l==r)tr[u]={l,r,a[l],a[l],a[l],a[l],a[l],abs(a[l])}; else{ tr[u]={l,r}; int mid=(l+r)/2; build(u<<1,l,mid),build(u<<1|1,mid+1,r); pushup(u); } }
void solve(){ int n;cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; build(1,1,n); cin>>q; while(q--){ int l,r;cin>>l>>r; auto t=query(1,l,r); cout<<t.ans<<"\n"; } }
signed main(){ solve(); return 0; }
|