/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 3ms 532.0 KiB
#2 Accepted 13ms 580.0 KiB
#3 Accepted 8ms 532.0 KiB
#4 Accepted 10ms 576.0 KiB
#5 Accepted 11ms 536.0 KiB
#6 Accepted 11ms 532.0 KiB
#7 Accepted 22ms 532.0 KiB
#8 Accepted 19ms 600.0 KiB
#9 Accepted 8ms 532.0 KiB
#10 Accepted 8ms 576.0 KiB
#11 Accepted 9ms 532.0 KiB
#12 Accepted 11ms 608.0 KiB
#13 Accepted 12ms 596.0 KiB
#14 Accepted 12ms 532.0 KiB
#15 Accepted 14ms 588.0 KiB
#16 Accepted 14ms 604.0 KiB
#17 Accepted 23ms 532.0 KiB
#18 Accepted 23ms 576.0 KiB
#19 Accepted 12ms 532.0 KiB
#20 Accepted 18ms 616.0 KiB
#21 Accepted 19ms 592.0 KiB
#22 Accepted 19ms 532.0 KiB
#23 Accepted 23ms 576.0 KiB
#24 Accepted 23ms 576.0 KiB
#25 Accepted 8ms 580.0 KiB
#26 Accepted 8ms 532.0 KiB
#27 Accepted 8ms 532.0 KiB
#28 Accepted 8ms 536.0 KiB
#29 Accepted 10ms 604.0 KiB
#30 Accepted 12ms 532.0 KiB
#31 Accepted 16ms 532.0 KiB
#32 Accepted 16ms 580.0 KiB
#33 Accepted 16ms 532.0 KiB
#34 Accepted 23ms 532.0 KiB
#35 Accepted 23ms 532.0 KiB
#36 Accepted 12ms 612.0 KiB
#37 Accepted 12ms 584.0 KiB
#38 Accepted 18ms 608.0 KiB
#39 Accepted 23ms 532.0 KiB
#40 Accepted 16ms 596.0 KiB
#41 Accepted 16ms 600.0 KiB
#42 Accepted 84ms 8.02 MiB
#43 Accepted 83ms 7.77 MiB
#44 Accepted 107ms 8.02 MiB
#45 Accepted 84ms 7.816 MiB
#46 Accepted 87ms 8.02 MiB
#47 Accepted 86ms 8.02 MiB
#48 Accepted 87ms 7.82 MiB
#49 Accepted 81ms 8.023 MiB
#50 Accepted 87ms 7.828 MiB

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;

struct segmenttree
{
    int n;
    vector<int> st, lazy;

    void init(int _n)
    {
        n = _n;
        st.assign(4 * n, 0);
        lazy.assign(4 * n, 0);
    }

    int comb(int a, int b)
    {
        return max(a, b);
    }

    void build(int start, int end, int node, vector<int> &v)
    {
        if (start == end)
        {
            st[node] = v[start];
            return;
        }
        int mid = (start + end) / 2;
        build(start, mid, 2 * node + 1, v);
        build(mid + 1, end, 2 * node + 2, v);
        st[node] = comb(st[2 * node + 1], st[2 * node + 2]);
    }

    void build(vector<int> &v)
    {
        build(0, n - 1, 0, v);
    }

    void push(int start, int end, int node)
    {
        if (lazy[node] != 0)
        {
            st[node] += lazy[node];

            if (start != end)
            { // not a leaf
                lazy[2 * node + 1] += lazy[node];
                lazy[2 * node + 2] += lazy[node];
            }
            lazy[node] = 0;
        }
    }

    void update(int start, int end, int l, int r, int node, int value)
    {
        push(start, end, node);

        if (start > r || end < l)
            return; // no overlap

        if (start >= l && end <= r)
        {
            lazy[node] += value;
            push(start, end, node);
            return;
        }

        int mid = (start + end) / 2;
        update(start, mid, l, r, 2 * node + 1, value);
        update(mid + 1, end, l, r, 2 * node + 2, value);
        st[node] = comb(st[2 * node + 1], st[2 * node + 2]);
    }

    int query(int start, int end, int l, int r, int node)
    {
        push(start, end, node);

        if (start > r || end < l)
            return LLONG_MIN;

        if (start >= l && end <= r)
            return st[node];

        int mid = (start + end) / 2;
        int q1 = query(start, mid, l, r, 2 * node + 1);
        int q2 = query(mid + 1, end, l, r, 2 * node + 2);
        return comb(q1, q2);
    }

    // wrappers
    void update(int l, int r, int value)
    {
        update(0, n - 1, l, r, 0, value);
    }

    int query(int l, int r)
    {
        return query(0, n - 1, l, r, 0);
    }
};

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--)
    {
        int n, q;
        cin >> n;
        vector<int> arr(n);
        for (int i = 0; i < n; i++)
        {
            cin >> arr[i];
        }

        segmenttree tree;
        tree.init(n);
        tree.build(arr);

        cin >> q;
        while (q--)
        {
            int type;
            cin >> type;
            if (type == 1)
            {
                int l, r, x;
                cin >> l >> r >> x;
                l--, r--;
                tree.update(l, r, x);
            }
            else
            {
                int l, r;
                cin >> l >> r;
                l--, r--;
                cout << tree.query(l, r) << "\n";
            }
        }
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1211 Range MAX
Contest
LUCC Presents Intra LU Junior Programming Contest - Replay
Language
C++17 (G++ 13.2.0)
Submit At
2025-09-02 17:09:52
Judged At
2025-09-02 17:09:52
Judged By
Score
100
Total Time
107ms
Peak Memory
8.023 MiB