➤ Problem Link : SEGSQRSS
👉 Hint : Build two Segment Trees with Lazy Propagation
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int ll st[400001],lazyAdd[400001],lazySet[400001]; ll arr[200001]; ll st2[400001]; void build(ll v, ll l, ll r) { if(l==r) { st2[v]=arr[l]; st[v]=arr[l]*arr[l]; lazySet[v]=lazyAdd[v]=0; return; } ll mid=(l+r)/2; build(2*v,l,mid); build(2*v+1,mid+1,r); st2[v]=st2[2*v]+st2[2*v+1]; st[v]=st[2*v]+st[2*v+1]; lazySet[v]=lazyAdd[v]=0; } void propagateLazy(ll v, ll l, ll r) { if(l!=r) { if(lazySet[v]==0) { lazyAdd[2*v]+=lazyAdd[v]; lazyAdd[2*v+1]+=lazyAdd[v]; } else if(lazyAdd[v]==0) { lazySet[2*v]=lazySet[v]; lazySet[2*v+1]=lazySet[v]; lazyAdd[2*v]=lazyAdd[2*v+1]=0; } else { lazySet[2*v]=lazySet[v]; lazySet[2*v+1]=lazySet[v]; lazyAdd[2*v]=lazyAdd[v]; lazyAdd[2*v+1]=lazyAdd[v]; } if(lazySet[v]!=0) { st[v]=(r-l+1)*lazySet[v]*lazySet[v]; st2[v]=(r-l+1)*lazySet[v]; } st[v]+=(r-l+1)*lazyAdd[v]*lazyAdd[v]+2*st2[v]*lazyAdd[v]; st2[v]+=(r-l+1)*lazyAdd[v]; lazyAdd[v]=0; lazySet[v]=0; } } void updateAdd(ll v,ll s, ll e,ll l, ll r, ll x) { if(lazyAdd[v]!=0 || lazySet[v]!=0) propagateLazy(v,s,e); if(s>r || e<l) return; if(s>=l && e<=r) { lazyAdd[v]+=x; propagateLazy(v,s,e); return; } ll mid=(s+e)/2; updateAdd(2*v,s,mid,l,r,x); updateAdd(2*v+1,mid+1,e,l,r,x); st2[v]=st2[2*v]+st2[2*v+1]; st[v]=st[2*v]+st[2*v+1]; } void updateSet(ll v,ll s, ll e,ll l, ll r, ll x) { if(lazyAdd[v]!=0 || lazySet[v]!=0) propagateLazy(v,s,e); if(s>r || e<l) return; if(s>=l && e<=r) { lazyAdd[v]=0; lazySet[v]=x; propagateLazy(v,s,e); return; } ll mid=(s+e)/2; updateSet(2*v,s,mid,l,r,x); updateSet(2*v+1,mid+1,e,l,r,x); st[v]=st[2*v]+st[2*v+1]; } ll query(ll v, ll s, ll e,ll l, ll r) { if(lazyAdd[v]!=0 || lazySet[v]!=0) propagateLazy(v,s,e); if(s>r || e<l) return 0; if(s>=l && e<=r) return st[v]; ll mid=(s+e)/2; return query(2*v,s,mid,l,r)+query(2*v+1,mid+1,e,l,r); } int main() { int t; cin>>t; for(int k=1;k<=t;k++) { ll n,q; cin>>n>>q; for(ll i=1;i<=n;i++) cin>>arr[i]; build(1,1,n); int x,l,r,b; cout<<"Case "<<k<<":\n"; while(q--) { cin>>b; if(b==2) { cin>>l>>r; cout<<query(1,1,n,l,r)<<"\n"; } else if(b==1) { cin>>l>>r>>x; updateAdd(1,1,n,l,r,x); } else { cin>>l>>r>>x; updateSet(1,1,n,l,r,x); } } } }
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!!