Submission #1318890

#TimeUsernameProblemLanguageResultExecution timeMemory
1318890SofiatpcSjeckanje (COCI21_sjeckanje)C++20
0 / 110
24 ms56776 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll INF = 1e15;
struct no{
    ll pp, nn, np, pn, okp, okn, pok, nok, okok;
    no(){ pp = -INF, nn = -INF, np = -INF, pn = -INF, okok = 0;}
};
const int MAXN = 2*1e5+5;
int a[MAXN], lz[MAXN];
no seg[MAXN*4];

no merge(no a, no b){
    no resp;
    resp.pp = max( { a.pp, b.pp, a.pok + b.okp, a.pn + b.pp, a.pp + b.np } );
    resp.pn = max( { a.pn, b.pn, a.pok + b.okn, a.pn + b.pn, a.pp + b.nn } );
    resp.np = max( { a.np, b.np, a.nok + b.okp, a.nn + b.pp, a.np + b.np } );
    resp.nn = max( { a.nn, b.nn, a.nok + b.okn, a.nn + b.pn, a.np + b.nn } );

    resp.okp = max( { a.okp, b.okp, a.okok + b.okp, a.okn + b.pp, a.okp + b.np } );
    resp.okn = max( { a.okn, b.okn, a.okok + b.okn, a.okn + b.pn, a.okp + b.nn } );
    resp.pok = max( { a.pok, b.pok, a.pok + b.okok, a.pn + b.pok, a.pp + b.nok } );
    resp.nok = max( { a.nok, b.nok, a.nok + b.okok, a.nn + b.pok, a.np + b.nok } );
    resp.okok = max( { a.okok + b.okok, a.okn + b.pok, a.okp + b.nok } );
    return resp;
}

int calma;
void build(int node, int l, int r){
    if(l == r){
        seg[node].okn = -a[l]; seg[node].nok = -a[l];
        seg[node].okp = a[l]; seg[node].pok = a[l];
        return;
    }

    int mid = (l+r)/2, e = node*2,d = node*2+1;
    build(e,l,mid); build(d,mid+1,r);

    seg[node] = merge(seg[e], seg[d]);
}

void refresh(int node, int l, int r){
    seg[node].pp += 2*lz[node];  
    seg[node].nn -= 2*lz[node];
    seg[node].okp += lz[node]; seg[node].pok += lz[node];
    seg[node].okn -= lz[node]; seg[node].nok -= lz[node];
    
    if(l != r){
        lz[node*2] += lz[node];
        lz[node*2+1] += lz[node];
    }
    lz[node] = 0; 
}

void update(int node, int l, int r, int& i, int& j, int& x){
    refresh(node,l,r);
    if(j < l || r < i)return;
    if(i <= l && r <= j){
        lz[node] += x;
        refresh(node,l,r);
        return;
    }

    int mid = (l+r)/2,e = node*2,d = node*2+1;
    update(e,l,mid,i,j,x); update(d,mid+1,r,i,j,x);

    seg[node] = merge(seg[e], seg[d]);
}

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

    int n,q; cin>>n>>q;
    for(int i = 1; i <= n; i++)cin>>a[i];
    build(1,1,n);

    while(q--){
        int l,r,x; cin>>l>>r>>x;
        update(1,1,n,l,r,x);
        refresh(1,1,n);
        cout<< seg[1].okok <<"\n";
    }    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...