Submission #850181

#TimeUsernameProblemLanguageResultExecution timeMemory
850181gun_ganSjeckanje (COCI21_sjeckanje)C++17
110 / 110
303 ms38372 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MX = 2e5 + 5;

int N, Q;
ll A[MX], B[MX];

struct segtree {

      struct node {
            ll lv = 0, rv = 0, dp[2][2] {}; // sign of left, sign of right, dp values;
            // 0 -> exclude , 1 -> include
      };

      node t[4 * MX];

      node merge(node a, node b) {

            if(!a.lv) return b;
            if(!b.lv) return a;

            node c;

            c.dp[0][0] = max(a.dp[0][1] + b.dp[0][0], a.dp[0][0] + b.dp[1][0]); 
            c.dp[0][1] = max(a.dp[0][1] + b.dp[0][1], a.dp[0][0] + b.dp[1][1]);
            c.dp[1][0] = max(a.dp[1][0] + b.dp[1][0], a.dp[1][1] + b.dp[0][0]);
            c.dp[1][1] = max(a.dp[1][1] + b.dp[0][1], a.dp[1][0] + b.dp[1][1]);

            if(a.rv == b.lv) {
                  c.dp[0][0] = max(c.dp[0][0], a.dp[0][1] + b.dp[1][0]);
                  c.dp[0][1] = max(c.dp[0][1], a.dp[0][1] + b.dp[1][1]);
                  c.dp[1][0] = max(c.dp[1][0], a.dp[1][1] + b.dp[1][0]);
                  c.dp[1][1] = max(c.dp[1][1], a.dp[1][1] + b.dp[1][1]);
            }

            c.lv = a.lv;
            c.rv = b.rv;

            return c;
      }

      void update(int v, int l, int r, int pos, int x) {
            if(r < pos || l > pos) return;
            if(l == r) {
                  B[l] += x;
                  t[v].dp[0][0] = 0;
                  t[v].dp[0][1] = 0;
                  t[v].dp[1][0] = 0;
                  t[v].dp[1][1] = abs(B[l]);
                  t[v].lv = B[l] >= 0 ? 1 : -1;
                  t[v].rv = B[l] >= 0 ? 1 : -1;
                  return;
            }
            int mid = (l + r) >> 1;
            update(v * 2 + 0, l, mid + 0, pos, x);
            update(v * 2 + 1, mid + 1, r, pos, x);
            t[v] = merge(t[v * 2 + 0], t[v * 2 + 1]);
      }

      void build(int v, int l, int r) {
            if(l == r) {
                  t[v].dp[0][0] = 0;
                  t[v].dp[0][1] = 0;
                  t[v].dp[1][0] = 0;
                  t[v].dp[1][1] = abs(B[l]);
                  t[v].lv = B[l] >= 0 ? 1 : -1;
                  t[v].rv = B[l] >= 0 ? 1 : -1;
                  return;
            }
            int mid = (l + r) >> 1;
            build(v * 2 + 0, l, mid + 0);
            build(v * 2 + 1, mid + 1, r);
            t[v] = merge(t[v * 2 + 0], t[v * 2 + 1]);
      }
} st;

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

      cin >> N >> Q;

      for(int i = 1; i <= N; i++) 
            cin >> A[i];
      
      for(int i = 1; i < N; i++) 
            B[i] = A[i + 1] - A[i];

      st.build(1, 1, N - 1);

      for(int i = 1; i <= Q; i++) {

            int l, r, x;
            cin >> l >> r >> x; 

            st.update(1, 1, N - 1, l - 1, x);
            st.update(1, 1, N - 1, r, -x);

            cout << st.t[1].dp[1][1] << '\n';
      }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...