제출 #1342163

#제출 시각아이디문제언어결과실행 시간메모리
1342163nguyenkhangninh99Sjeckanje (COCI21_sjeckanje)C++20
0 / 110
82 ms188152 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 1e6 + 5;
int a[maxn], d[maxn];

struct node{
    int f[2][2], l, r;
    node(){memset(f, -60, sizeof(f));}
    void init(int x){
        f[0][0] = 0;
        f[1][1] = abs(x);
        f[0][1] = f[1][0] = -1e15;
        l = r = (x < 0 ? -1 : (x > 0 ? 1 : 0));
    }
    int get(){
        return max({f[0][0], f[0][1], f[1][0], f[1][1]});
    }
} st[4 * maxn];
node merge(node ll, node rr){
    node ans;
    ans.l = ll.l, ans.r = rr.r;

    for(int x: {0, 1}){
        for(int y: {0, 1}){
            for(int i: {0, 1}){
                for(int j: {0, 1}) if(i + j != 2) ans.f[x][y] = max(ans.f[x][y], ll.f[x][i] + rr.f[j][y]);
            }
            if(ll.r * rr.l >= 0) ans.f[x][y] = max(ans.f[x][y], ll.f[x][1] + rr.f[1][y]);
        }
    }
    return ans;
}
void update(int r, int pos, int val){
    int l = 1, id = 1;
    while(l < r){
        int mid = (l + r) / 2;
        if(pos <= mid) r = mid, id = id * 2;
        else l = mid + 1, id = id * 2 + 1; 
    }
    st[id].init(d[pos]);
    while(id > 1){
        id /= 2;
        st[id] = merge(st[id * 2], st[id * 2 + 1]);
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n, q; cin >> n >> q;
    
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i < n; i++){
        d[i] = a[i + 1] - a[i];
        update(n - 1, i, d[i]);
    } 

    while(q--){
        int l, r, x; cin >> l >> r >> x;
        d[l - 1] += x;
        d[r] -= x;
        if(1 <= l) update(n - 1, l - 1, d[l - 1]); 
        if(r < n) update(n - 1, r, d[r]);
        cout << st[1].get() << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...