LightOJ 1164 - Horrible Queries

// Accepted
// Modified

#include<bits/stdc++.h>

using namespace std;

#define fast ios_base::sync_with_stdio(false)
#define bfast cin.tie(0)
#define outs(x) cout << x << " "
#define outn(x) cout << x << "\n"
#define sf scanf
#define pf printf
#define nl puts("")
#define psb push_back

typedef long long LL;
typedef vector<int>vii;
typedef vector<LL>vll;

const int high = 100003;

struct info
{
    LL sum, prop;
};

info tree[high * 4];

void update(int node, int b , int e , int i, int j , int x)
{
    if(b==i and e==j)
    {
        tree[node].sum+=(x * (e - b + 1));
        tree[node].prop+=x;
        return;
    }

    int Left = node << 1;
    int Right = (node << 1) + 1;
    int mid = (b + e) >> 1;

    if(j <= mid)
    {
        update(Left, b , mid , i , j , x);
    }

    else if(i > mid)
    {
        update(Right, mid+1 , e , i , j , x);
    }

    else
    {
        update(Left, b , mid, i , mid , x);
        update(Right, mid+1 , e , mid+1 , j , x);
    }

    tree[node].sum = tree[Left].sum + tree[Right].sum + (tree[node].prop * (e - b + 1));
}

LL query(int node, int b , int e , int i , int j , LL carry=0)
{
    if(b==i and e==j)
    {
        return tree[node].sum + (carry * (e - b + 1));
    }

    int Left = node << 1;
    int Right = (node << 1) + 1;
    int mid = (b + e) >> 1;

    if(j <= mid)
    {
        return query(Left, b , mid , i , j , carry + tree[node].prop);
    }

    else if(i > mid)
    {
        return query(Right, mid+1 , e , i , j , carry + tree[node].prop);
    }

    else
    {
        LL p1 = query(Left, b , mid, i , mid , carry + tree[node].prop);
        LL p2 = query(Right, mid+1, e , mid+1, j , carry + tree[node].prop);

        return p1 + p2;
    }
}

int main()
{
    //freopen("out.txt" , "w" , stdout);
    int type, t , n , q , i , j , v , tc=0;
    sf("%d", &t);
    while(t--)
    {
        memset(tree, 0 , sizeof(tree));

        sf("%d %d", &n , &q);

        pf("Case %d:\n", ++tc);

        while(q--)
        {
            sf("%d", &type);

            if(type)
            {
                sf("%d %d", &i , &j);

                pf("%lld\n", query(1 , 0 , n , i , j , 0));
            }

            else
            {
                sf("%d %d %d", &i , &j , &v);
                update(1 , 0 , n , i , j , v);
            }
        }
    }

    return 0;
}

Comments

Popular posts from this blog

SPOJ-CMG - Collecting Mango

LightOJ 1009 - Back to Underworld

LeetCode Palindrome Number