➤ Problem Link : GSS5
👉 Hint : Segment Tree with prefix, suffix, maximum and total sum in node
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int #define mp make_pair struct Node{ ll tsum,pfx,sfx,mx; }; Node st[400001]; ll arr[100001]; typedef struct Node NODE; void build(int v, int l, int r) { if(l==r) { st[v].tsum=st[v].pfx=st[v].sfx=st[v].mx=arr[l]; return; } int mid=(l+r)/2; build(2*v,l,mid); build(2*v+1,mid+1,r); st[v].tsum=st[2*v].tsum+st[2*v+1].tsum; st[v].pfx=max(st[2*v].pfx,st[2*v].tsum+st[2*v+1].pfx); st[v].sfx=max(st[2*v+1].sfx,st[2*v+1].tsum+st[2*v].sfx); st[v].mx=max(st[2*v].sfx+st[2*v+1].pfx,max(st[2*v].mx,st[2*v+1].mx)); } Node query(int v,int s, int e, int l, int r) { Node q; q.tsum=0; q.pfx=q.sfx=INT_MIN; q.mx=INT_MIN; if(s>r || e<l) { return q; } if(s>=l && e<=r) return st[v]; int mid=(s+e)/2; Node lt=query(2*v,s,mid,l,r); Node rt=query(2*v+1,mid+1,e,l,r); q.tsum=lt.tsum+rt.tsum; q.pfx=max(lt.pfx,lt.tsum+rt.pfx); q.sfx=max(rt.sfx,rt.tsum+lt.sfx); q.mx=max(lt.sfx+rt.pfx,max(lt.mx,rt.mx)); return q; } int main() { int t; cin>>t; while(t--) { int n,m,x1,y1,x2,y2; cin>>n; for(int i=1;i<=n;i++) cin>>arr[i]; build(1,1,n); cin>>m; while(m--) { cin>>x1>>y1>>x2>>y2; if(x2==y1) cout<<query(1,1,n,x1,y1).sfx+query(1,1,n,x2,y2).pfx-arr[x2]<<"\n"; else if(x2==y1+1) cout<<query(1,1,n,x1,y1).sfx+query(1,1,n,x2,y2).pfx<<"\n"; else if(x2>y1) cout<<query(1,1,n,x1,y1).sfx+query(1,1,n,x2,y2).pfx+query(1,1,n,y1+1,x2-1).tsum<<"\n"; else cout<<max(query(1,1,n,x1,x2).sfx+query(1,1,n,x2,y2).pfx-arr[x2],max(query(1,1,n,x2,y1).mx,query(1,1,n,x2,y1).sfx+query(1,1,n,y1,y2).pfx - arr[y1] ))<<"\n"; } } }
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!