Submission #556122

#TimeUsernameProblemLanguageResultExecution timeMemory
556122AlexandruabcdeSjeckanje (COCI21_sjeckanje)C++14
110 / 110
548 ms36624 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
constexpr LL INF = 1LL * 1e16;
constexpr int NMAX = 2e5 + 5;

LL val[NMAX];
struct Node {
    LL dp[2][2];
};

LL modul (LL x) {
    if (x < 0) x = -x;
    return x;
}

void CompareBest (LL &x, LL y) {
    x = max(x, y);
}

class SegmentTree {
private:
    vector <Node> arb;
    int sz;

    void Comb (int nod, int a, int b) {
        int st = 2 * nod, dr = 2 * nod + 1;
        int mij = (a + b) / 2;

        for (int caz_st = 0; caz_st < 2; ++ caz_st)
            for (int caz_dr = 0; caz_dr < 2; ++ caz_dr) {
                arb[nod].dp[caz_st][caz_dr] = -INF;

                CompareBest(arb[nod].dp[caz_st][caz_dr], arb[st].dp[caz_st][0] + arb[dr].dp[0][caz_dr]);
                CompareBest(arb[nod].dp[caz_st][caz_dr], arb[st].dp[caz_st][0] + arb[dr].dp[1][caz_dr]);
                CompareBest(arb[nod].dp[caz_st][caz_dr], arb[st].dp[caz_st][1] + arb[dr].dp[0][caz_dr]);

                if (val[mij] * val[mij+1] >= 0)
                    CompareBest(arb[nod].dp[caz_st][caz_dr], arb[st].dp[caz_st][1] + arb[dr].dp[1][caz_dr]);
            }
    }

    void Update (int nod, int a, int b, int poz, LL val) {
        if (a == b) {
            arb[nod].dp[0][0] = 0;
            arb[nod].dp[1][1] = modul(val);
            arb[nod].dp[1][0] = arb[nod].dp[0][1] = -INF;
            return;
        }

        int mij = (a + b) / 2;

        if (poz <= mij) Update(2*nod, a, mij, poz, val);
        else Update(2*nod+1, mij+1, b, poz, val);

        Comb(nod, a, b);
    }

public:
    void Init (int Size) {
        arb.resize(4*Size+4);
        for (int i = 1; i <= 4 * Size; ++ i ) {
            arb[i].dp[0][0] = arb[i].dp[1][1] = 0;
            arb[i].dp[1][0] = arb[i].dp[0][1] = -INF;
        }
        sz = Size;
    }

    void Update (int pos, LL value) {
        Update(1, 1, sz, pos, value);
    }

    LL Best () {
        LL ans = 0;
        CompareBest(ans, arb[1].dp[0][0]);
        CompareBest(ans, arb[1].dp[1][0]);
        CompareBest(ans, arb[1].dp[0][1]);
        CompareBest(ans, arb[1].dp[1][1]);

        return ans;
    }
};

SegmentTree SGT;
int N, Q;

void Read () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> Q;

    for (int i = 1; i <= N; ++ i )
        cin >> val[i];

    for (int i = 1; i < N; ++ i )
        val[i] = val[i] - val[i+1];
    val[N] = 0;
    SGT.Init(N-1);

    for (int i = 1; i < N; ++ i )
        SGT.Update(i, val[i]);
}

void Solve () {
    for (; Q; -- Q ) {
        int l, r;
        LL x;
        cin >> l >> r >> x;

        val[l-1] -= x;
        val[r] += x;

        if (l-1 > 0) SGT.Update(l-1, val[l-1]);
        if (r < N) SGT.Update(r, val[r]);

        cout << SGT.Best() << '\n';
    }
}

int main () {
    Read();
    Solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...