제출 #712733

#제출 시각아이디문제언어결과실행 시간메모리
712733JohannSjeckanje (COCI21_sjeckanje)C++14
55 / 110
2059 ms5696 KiB
#include "bits/stdc++.h"
using namespace std;

typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
#define sz(x) (int)(x).size()

int k;
struct item
{
    int first, last;
    vvi cnt;
    item()
    {
        first = last = -1;
        cnt.assign(k, vi(k, 0));
    }
};

struct segtree
{
    int size;
    vector<item> arr;
    vi op;
    void create(int x, int c, int len)
    {
        arr[x].first = arr[x].last = c;
        for (int i = 0; i < sz(arr[x].cnt); ++i)
            for (int j = 0; j < sz(arr[x].cnt.front()); ++j)
                arr[x].cnt[i][j] = 0;
        if (c != -1)
            arr[x].cnt[c][c] = len - 1;
    }
    void combine(int x, item &a, item &b)
    {
        arr[x].first = a.first, arr[x].last = b.last;
        for (int i = 0; i < sz(arr[x].cnt); ++i)
            for (int j = 0; j < sz(arr[x].cnt.front()); ++j)
                arr[x].cnt[i][j] = a.cnt[i][j] + b.cnt[i][j];
        if (a.last != -1 && b.first != -1)
            ++arr[x].cnt[a.last][b.first];
    }
    void apply(int x, int len)
    {
        if (op[x] == -1)
            return;
        create(x, op[x], len);
        if (x < size)
            op[2 * x] = op[2 * x + 1] = op[x];
        op[x] = -1;
    }
    void init(string &s)
    {
        size = 1;
        while (size < sz(s))
            size *= 2;
        op.assign(2 * size, -1);
        arr.resize(2 * size);
        for (int i = 0; i < sz(s); ++i)
            create(i + size, s[i] - 'a', 1);
        for (int i = size - 1; i > 0; --i)
            combine(i, arr[2 * i], arr[2 * i + 1]);
    }
    void set(int l, int r, int c)
    {
        set(l, r, c, 1, 0, size);
    }
    void set(int l, int r, int c, int x, int lx, int rx)
    {
        apply(x, rx - lx);
        if (l <= lx && rx <= r)
        {
            op[x] = c;
            apply(x, rx - lx);
            return;
        }
        if (r <= lx || rx <= l)
            return;
        int m = (lx + rx) / 2;
        set(l, r, c, 2 * x, lx, m);
        set(l, r, c, 2 * x + 1, m, rx);
        combine(x, arr[2 * x], arr[2 * x + 1]);
    }
    int query(string &per)
    {
        vi pos(sz(per));
        for (int i = 0; i < sz(per); ++i)
            pos[per[i] - 'a'] = i;
        int ans = 1; // initial thing
        for (int i = 0; i < sz(arr[1].cnt); ++i)
            for (int j = 0; j < sz(arr[1].cnt.front()); ++j)
                if (pos[i] >= pos[j])
                    ans += arr[1].cnt[i][j];
        return ans;
    }
};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int N, Q;
    cin >> N >> Q;
    vi A(N);
    for (int i = 0; i < N; ++i)
        cin >> A[i];

    for (int q = 0; q < Q; ++q)
    {
        ll l, r, x;
        cin >> l >> r >> x;
        --l;
        for (int i = l; i < r; ++i)
            A[i] += x;

        vi dp(N, 0);
        dp[0] = 0;
        dp[1] = abs(A[0] - A[1]);
        for (int i = 2; i < N; ++i)
        {
            ll delta = abs(A[i] - A[i - 1]);
            if ((A[i - 2] <= A[i - 1] && A[i - 1] <= A[i]) || (A[i - 2] >= A[i - 1] && A[i - 1] >= A[i]))
                dp[i] = dp[i - 1] + delta;
            else
                dp[i] = max(dp[i - 1], dp[i - 2] + delta);
        }
        cout << dp.back() << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...