Submission #1087565

#TimeUsernameProblemLanguageResultExecution timeMemory
1087565vjudge1Sjeckanje (COCI21_sjeckanje)C++17
110 / 110
372 ms27984 KiB
#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_) for(int V_=(A_), V_##_END=(B_); V_>=V_##_END; V_--)
#ifdef _WIN32
#define long __int64
#endif
using namespace std;
const int MAXN=2e5+10; const long INFL=1e18;
int n,qn; long A[MAXN];
void tomax(long& x,long y){ x=max(x,y); }
struct SGT{
#define ls (u*2)
#define rs (u*2+1)
#define mid ((l+r)/2)
    struct{ long mx[2][2]; } T[MAXN*4];
    void pushup(int u,int l,int r){
        RNG(tl,0,1){
            RNG(tr,0,1){
                T[u].mx[tl][tr]=0;
                tomax(T[u].mx[tl][tr],T[ls].mx[tl][0]+T[rs].mx[0][tr]);
                tomax(T[u].mx[tl][tr],T[ls].mx[tl][0]+T[rs].mx[1][tr]);
                tomax(T[u].mx[tl][tr],T[ls].mx[tl][1]+T[rs].mx[0][tr]);
                if((A[mid]>=0&&A[mid+1]>=0)||(A[mid]<=0&&A[mid+1]<=0)) tomax(T[u].mx[tl][tr],T[ls].mx[tl][1]+T[rs].mx[1][tr]);
            }
        }
    }
    void build(int u,int l,int r){
        if(l==r){
            T[u].mx[0][0]=0,T[u].mx[1][1]=labs(A[l]);
            T[u].mx[0][1]=T[u].mx[1][0]=0;
            return;
        }
        build(ls,l,mid),build(rs,mid+1,r);
        pushup(u,l,r);
    }
    void upd(int u,int l,int r,int i){
        if(l==r){
            T[u].mx[0][0]=0,T[u].mx[1][1]=labs(A[i]);
            T[u].mx[0][1]=T[u].mx[1][0]=0;
            return;
        }
        if(i<=mid) upd(ls,l,mid,i);
        else upd(rs,mid+1,r,i);
        pushup(u,l,r);
    }
#undef ls
#undef rs
#undef mid
} sgt;
int main(){
#if defined(_LOCAL_)
    freopen("in","r",stdin);
    freopen("out","w",stdout);
#else
#endif
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    cin>>n>>qn;
    RNG(i,1,n) cin>>A[i];
    IRNG(i,n,1) A[i]-=A[i-1];
    sgt.build(1,2,n);
    RNG(_,1,qn){
        int l,r; long x; cin>>l>>r>>x;
        A[l]+=x,A[r+1]-=x;
        if(l>=2) sgt.upd(1,2,n,l);
        if(r+1<=n) sgt.upd(1,2,n,r+1);
        auto ans=max({sgt.T[1].mx[0][0],sgt.T[1].mx[0][1],sgt.T[1].mx[1][0],sgt.T[1].mx[1][1]});
        cout<<ans<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...