HORRIBLE - Horrible Queries

Standard range query, range update, Sum Segment Tree.

Time complexity: $O(q \log{n})$

Memory complexity: $O(n)$

Click to show code.


const int NMAX = 1e5 + 10;
using namespace std;
using ll = long long;
ll n, a[NMAX], seg[4 * NMAX], lazy[4 * NMAX];
void build(ll a[], ll v, ll tl, ll tr)
{
    if (tl == tr)
        seg[v] = a[tl];
    else
    {
        ll tm = (tl + tr) / 2;
        build(a, v * 2, tl, tm);
        build(a, v * 2 + 1, tm + 1, tr);
        seg[v] = seg[2 * v] + seg[2 * v + 1];
    }
}
void lazy_propagate(ll v, ll tl, ll tr, ll val)
{
    seg[v] += (tr - tl + 1) * val;
    if (tl != tr)
    {
        lazy[2 * v] += val;
        lazy[2 * v + 1] += val;
    }
    lazy[v] = 0;
}
void update(ll v, ll tl, ll tr, ll ql, ll qr, ll x)
{
    if (lazy[v] != 0)
        lazy_propagate(v, tl, tr, lazy[v]);
    if (ql > qr)
        return;
    if (tl == ql and tr == qr)
        lazy_propagate(
            v, tl, tr, x);
    else
    {
        ll tm = (tl + tr) / 2;
        update(v * 2, tl, tm, ql, min(qr, tm), x);
        update(v * 2 + 1, tm + 1, tr, max(ql, tm + 1), qr, x);
        seg[v] = seg[2 * v] + seg[2 * v + 1];
    }
}
ll query(ll v, ll tl, ll tr, ll ql, ll qr)
{
    if (lazy[v] != 0)
        lazy_propagate(v, tl, tr, lazy[v]);
    if (ql > qr)
        return 0;
    if (tl == ql and tr == qr)
        return seg[v];
    else
    {
        ll tm = (tl + tr) / 2;
        return query(v * 2, tl, tm, ql, min(qr, tm)) +
               query(v * 2 + 1, tm + 1, tr, max(ql, tm + 1), qr);
    }
}
int main(void)
{
    ll t, q, type, l, r, x;
    cin >> t;
    while (t--)
    {
        cin >> n >> q;
        while (q--)
        {
            cin >> type >> l >> r;
            if (type)
                cout << query(1, 0, n - 1, l - 1, r - 1) << endl;
            else
            {
                cin >> x;
                update(1, 0, n - 1, l - 1, r - 1, x);
            }
        }
        memset(seg, 0, 4 * NMAX * sizeof(ll));
        memset(lazy, 0, 4 * NMAX * sizeof(ll));
        memset(a, 0, n * sizeof(ll));
    }
    return 0;
}