HORRIBLE - Horrible Queries - SPOJ Solution C++

  Problem Link : HORRIBLE 


👉 Hint : Segment Tree with Lazy Propagation

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
 
ll st[4*100001];
ll lazy[4*100001];
 
void propagateLazy(int ind,int l,int r)
{
    if(l!=r)
    {
        lazy[2*ind+1]+=lazy[ind];
        lazy[2*ind+2]+=lazy[ind];
    }
    st[ind]+=lazy[ind]*(r-l+1);
    lazy[ind]=0;
 
}
 
void update(int ind,int l,int r,int ql,int qr,int v)
{
    if(lazy[ind])
        propagateLazy(ind,l,r);
    if(l>qr || r<ql)
        return;
    if(ql<=l && r<=qr)
    {
        lazy[ind]+=v;
        propagateLazy(ind,l,r);
        return;
    }
    int m=(l+r)/2;
    update(2*ind+1,l,m,ql,qr,v);
    update(2*ind+2,m+1,r,ql,qr,v);
    st[ind]=st[2*ind+1]+st[2*ind+2];
}
 
ll query(int ind,int l,int r,int ql,int qr)
{
    if(lazy[ind])
        propagateLazy(ind,l,r);
    if(l>qr || r<ql)
        return 0;
    if(ql<=l && r<=qr)
        return st[ind];
    int m=(l+r)/2;
    return query(2*ind+1,l,m,ql,qr)+query(2*ind+2,m+1,r,ql,qr);
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin>>t;
    while(t--)
    {
        int n,c,p,q,v;
        bool i;
        cin>>n>>c;
        memset(st,0,sizeof(st));
        memset(lazy,0,sizeof(lazy));
        while(c--)
        {
            cin>>i;
            if(i)
            {
                cin>>p>>q;
                cout<<query(1,1,n,p,q)<<endl;
            }
            else
            {
                cin>>p>>q>>v;
                update(1,1,n,p,q,v);
            }
        }
    }
} 

 

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!!