Submission #382838

# Submission time Handle Problem Language Result Execution time Memory
382838 2021-03-28T09:44:49 Z ne4eHbKa Sjeckanje (COCI21_sjeckanje) C++17
110 / 110
1743 ms 50120 KB
#include <bits/stdc++.h>
using namespace std;
#ifndef _LOCAL
//#pragma GCC optimize("O3,Ofast")
#else
#pragma GCC optimize("O0")
#endif
template<typename t> inline void umin(t &a, const t b) {a = min(a, b);}
template<typename t> inline void umax(t &a, const t b) {a = max(a, b);}
typedef pair<int, int> pii;
typedef long long ll;
typedef long double ld;
typedef int8_t byte;
ll time() {return chrono::system_clock().now().time_since_epoch().count();}
mt19937 rnd(time());
#define ft first
#define sd second
#define len(f) int((f).size())
#define bnd(f) (f).begin(), (f).end()
#define _ <<' '<<
const int inf = 1e9 + 5;
const ll inf64 = 4e18 + 5;
const int md = 998244353;
namespace MD {
    void add(int &a, const int b) {if((a += b) >= md) a -= md;}
    void sub(int &a, const int b) {if((a -= b) < 0) a += md;}
    int prod(const int a, const int b) {return ll(a) * b % md;}
};

const int N = 2e5 + 5;
int a[N], q, n;
ll d[N];
//ll f[N][3];

struct tree {
    tree *l, *r;
    ll v[3][3];
    void init(int tl) {
        memset(v, -1, sizeof v);
        v[0][0] = 0;
        ll z = d[tl];
        if(z <= 0) v[1][1] = abs(z);
        if(z >= 0) v[2][2] = abs(z);
    }
    void upd() {
        for(int i : {0, 1, 2})
        for(int j : {0, 1, 2}) {
            v[i][j] = -1;
            for(int fl : {0, 1, 2}) {
                ll &le = l->v[i][fl];
                if(le < 0) continue;
                for(int fr : {0, 1, 2}) {
                    ll &ri = r->v[fr][j];
                    if(ri < 0) continue;
                    if(fl + fr == 3) continue;
                    umax(v[i][j], le + ri);
                }
            }
        }
    }
    tree(int tl = 1, int tr = n - 1) {
        if(tl < tr) {
            int tm = tl + tr >> 1;
            l = new tree(tl, tm);
            r = new tree(tm + 1, tr);
            upd();
        } else {
            init(tl);
            l = r = 0;
        }
    }
    ll ans() {
//        return max(f[n - 1][0], max(f[n - 1][1], f[n - 1][2]));
        ll res = 0;
        for(int i : {0, 1, 2})
            for(int j : {0, 1, 2})
                umax(res, v[i][j]);
        return res;
    }
    void reload(int i, int tl = 1, int tr = n - 1) {
//        for(int i = 1; i < n; ++i) {
//            for(int j : {0, 1, 2}) {
//                f[i][j] = -1;
//                for(int t : {0, 1, 2}) {
//                    if(f[i - 1][t] < 0) continue;
//                    if(t + j == 3) continue;
//                    if(j == 1 && d[i] > 0) continue;
//                    if(j == 2 && d[i] < 0) continue;
//                    umax(f[i][j], f[i - 1][t] + abs(d[i]) * !!j);
//                }
//            }
//        }
//        return;

        if(tl == tr) return init(tl);
        int tm = tl + tr >> 1;
        i <= tm
            ? l->reload(i, tl, tm)
            : r->reload(i, tm + 1, tr);
        upd();
    }
};

void solve() {
    cin >> n >> q;
    for(int i = 0; i < n; ++i)
        cin >> a[i];
    if(n == 1) {
        while(q--) cout << "0\n";
        return;
    }
    for(int i = 1; i < n; ++i)
        d[i] = a[i] - a[i - 1];
    tree t {};
    while(q--) {
        int l, r, x;
        cin >> l >> r >> x;
        if(--l) {
            d[l] += x;
            t.reload(l);
        }
        if(r < n)
            d[r] -= x,
            t.reload(r);
        cout << t.ans() << '\n';
    }
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifndef _LOCAL
//    freopen("file.in", "r", stdin);
//    freopen("file.out", "w", stdout);
#else
    system("color a");
    freopen("in.txt", "r", stdin);
    int t; cin >> t;
    while(t--)
#endif
    solve();
}

Compilation message

Main.cpp: In constructor 'tree::tree(int, int)':
Main.cpp:63:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   63 |             int tm = tl + tr >> 1;
      |                      ~~~^~~~
Main.cpp: In member function 'void tree::reload(int, int, int)':
Main.cpp:96:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   96 |         int tm = tl + tr >> 1;
      |                  ~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 2 ms 364 KB Output is correct
5 Correct 2 ms 364 KB Output is correct
6 Correct 2 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 2 ms 364 KB Output is correct
5 Correct 2 ms 364 KB Output is correct
6 Correct 2 ms 364 KB Output is correct
7 Correct 18 ms 1004 KB Output is correct
8 Correct 16 ms 1044 KB Output is correct
9 Correct 16 ms 1004 KB Output is correct
10 Correct 16 ms 1004 KB Output is correct
11 Correct 16 ms 1004 KB Output is correct
12 Correct 15 ms 1004 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 2 ms 364 KB Output is correct
5 Correct 2 ms 364 KB Output is correct
6 Correct 2 ms 364 KB Output is correct
7 Correct 18 ms 1004 KB Output is correct
8 Correct 16 ms 1044 KB Output is correct
9 Correct 16 ms 1004 KB Output is correct
10 Correct 16 ms 1004 KB Output is correct
11 Correct 16 ms 1004 KB Output is correct
12 Correct 15 ms 1004 KB Output is correct
13 Correct 1743 ms 47456 KB Output is correct
14 Correct 1667 ms 49516 KB Output is correct
15 Correct 1682 ms 49388 KB Output is correct
16 Correct 1668 ms 49388 KB Output is correct
17 Correct 1742 ms 49428 KB Output is correct
18 Correct 1570 ms 50120 KB Output is correct