/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Accepted 6ms 532.0 KiB
#3 Accepted 7ms 632.0 KiB
#4 Accepted 8ms 536.0 KiB
#5 Accepted 8ms 616.0 KiB
#6 Accepted 8ms 532.0 KiB
#7 Accepted 8ms 616.0 KiB
#8 Accepted 13ms 532.0 KiB
#9 Accepted 14ms 532.0 KiB
#10 Accepted 14ms 584.0 KiB
#11 Accepted 14ms 532.0 KiB
#12 Accepted 14ms 584.0 KiB
#13 Accepted 14ms 532.0 KiB
#14 Accepted 14ms 532.0 KiB
#15 Accepted 20ms 576.0 KiB
#16 Accepted 20ms 484.0 KiB
#17 Accepted 20ms 564.0 KiB
#18 Accepted 10ms 620.0 KiB
#19 Accepted 10ms 532.0 KiB
#20 Accepted 10ms 600.0 KiB
#21 Accepted 10ms 532.0 KiB
#22 Accepted 10ms 576.0 KiB
#23 Accepted 10ms 624.0 KiB
#24 Accepted 10ms 532.0 KiB
#25 Accepted 10ms 600.0 KiB
#26 Accepted 10ms 600.0 KiB
#27 Accepted 10ms 532.0 KiB
#28 Accepted 10ms 532.0 KiB
#29 Accepted 10ms 608.0 KiB
#30 Accepted 10ms 532.0 KiB
#31 Accepted 10ms 532.0 KiB
#32 Accepted 10ms 532.0 KiB
#33 Accepted 12ms 608.0 KiB
#34 Accepted 20ms 532.0 KiB
#35 Accepted 12ms 612.0 KiB
#36 Accepted 6ms 624.0 KiB
#37 Accepted 7ms 532.0 KiB
#38 Accepted 7ms 580.0 KiB
#39 Accepted 7ms 532.0 KiB
#40 Accepted 9ms 612.0 KiB
#41 Accepted 20ms 532.0 KiB
#42 Accepted 98ms 5.77 MiB
#43 Accepted 71ms 5.77 MiB
#44 Accepted 70ms 5.883 MiB
#45 Accepted 96ms 5.684 MiB
#46 Accepted 72ms 5.77 MiB
#47 Accepted 73ms 5.77 MiB
#48 Accepted 75ms 5.695 MiB
#49 Accepted 69ms 5.77 MiB
#50 Accepted 72ms 5.816 MiB

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll N = 1e5+5;
ll arr[N];

struct info {
    ll prop, mx;
} tree[N*3];

void segmentTree(ll currNode, ll left, ll right) {
    tree[currNode].mx = tree[currNode].prop = 0;
    if (left == right) {
        tree[currNode].mx = arr[left];
        return;
    } 
    
    ll leftNode = currNode*2, rightNode = currNode*2 + 1;
    ll mid = left + (right-left)/2;
    segmentTree(leftNode, left, mid);
    segmentTree(rightNode, mid+1, right);

    tree[currNode].mx = max(tree[leftNode].mx, tree[rightNode].mx);
}

ll query(ll currNode, ll left, ll right, ll i, ll j, ll carry = 0) {
    if (i > right or j < left) return LLONG_MIN;
    if (left >= i and right <= j) {
        return tree[currNode].mx + carry;
    }
    
    ll leftNode = currNode*2, rightNode = currNode*2 + 1;
    ll mid = left + (right-left)/2;
    ll leftMax = query(leftNode, left, mid, i, j, carry + tree[currNode].prop);
    ll rightMax = query(rightNode, mid + 1, right, i, j, carry + tree[currNode].prop);

    return max(leftMax, rightMax);
}

void update(ll currNode, ll left, ll right, ll i, ll j, ll newValue) {
    if (i > right or j < left) return;
    if (left >= i and right <= j) {
        tree[currNode].mx += newValue;
        tree[currNode].prop += newValue;
        return;
    }

    ll leftNode = currNode*2, rightNode = currNode*2 + 1;
    ll mid = left + (right-left)/2;
    update(leftNode, left, mid, i, j, newValue);
    update(rightNode, mid+1, right, i, j, newValue);
    
    tree[currNode].mx = max(tree[leftNode].mx, tree[rightNode].mx) + tree[currNode].prop;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int tc; cin >> tc;

    test:
    while (tc--) {
        ll n; cin >> n;
        
        for (ll i = 1; i <= n; i++) cin >> arr[i];
        segmentTree(1, 1, n);

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

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 16:23:56
Judged At
2025-09-02 16:23:56
Judged By
Score
100
Total Time
98ms
Peak Memory
5.883 MiB