Submission #1011712

#TimeUsernameProblemLanguageResultExecution timeMemory
1011712iahSjeckanje (COCI21_sjeckanje)C++14
110 / 110
1004 ms132176 KiB
#include<bits/stdc++.h>
using namespace std;

#define NAME "division"
#define ll long long
#define pii pair < int , int >
#define fi first
#define se second
#define bit(x, i) (((x) >> (i)) & 1ll)
#define mask(x) (1ll << (x))
#define mem(f, x) memset(f, x, sizeof(f))
#define sz(x) (int32_t) (x.size())

constexpr ll inf = 1e18;

struct Fenwick {
  int n;
  vector < ll > b;

  void init(int _n) {
    n = _n;
    b.assign(n + 1, 0);
  }

  void update(int i, ll val) {
    for (; i <= n; i += (i & (-i))) {
      b[i] += val;
    }
  }

  int get(int i) {
    int res = 0;

    for (; i > 0; i -= (i & (-i))) {
      res += b[i];
    }

    return res;
  }
}ft;

struct SegTree {
  int n;
  struct _data {
    bool left, right;
  };

  vector < _data > cmp;
  vector < vector < vector < ll > > > b;

  void init(int _n) {
    n = _n;
    b.assign(n * 4 + 1, vector < vector < ll > > (2, vector < ll > (2, 0)));
    cmp.assign(n * 4 + 1, {0, 0});
  }

  void combine(int id) {
    int l = id << 1, r = id << 1 | 1;
    cmp[id].left = cmp[l].left;
    cmp[id].right = cmp[r].right;
    for (int xl = 0; xl < 2; xl ++) {
      for (int yr = 0; yr < 2; yr ++) {
        b[id][xl][yr] = -inf;
//        cout << id << " " << xl << " " << yr << ":\n";
        for (int xr = 0; xr < 2; xr ++) {
          for (int yl = 0; yl < 2; yl ++) {
            if (cmp[l].right == cmp[r].left) {
              b[id][xl][yr] = max(b[id][xl][yr], b[l][xl][xr] + b[r][yl][yr]);
            }
            if (xr || yl) {
              b[id][xl][yr] = max(b[id][xl][yr], b[l][xl][xr] + b[r][yl][yr]);
//              cout << b[l][xl][xr] << " " << b[r][yl][yr] << " " << b[id][xl][yr] << "\n";
            }
          }
        }
//        cout << b[id][xl][yr] << "\n";
      }
    }
  }

  void _update(int id, int l, int r, int i, int val) {
    if (l > i || i > r) {
      return;
    }

    if (l == r) {
      cmp[id] = {val > 0, val > 0};
      b[id][0][0] = abs(val);
      b[id][0][1] = 0;
      b[id][1][0] = 0;
      b[id][1][1] = 0;
      return;
    }

    int mid = (l + r) >> 1;
    _update(id << 1, l, mid, i, val);
    _update(id << 1 | 1, mid + 1, r, i, val);
    combine(id);

//    cout << id << " " << l << " " << r << "\n";
//    for (int x = 0; x < 2; x ++) {
//      for (int y = 0; y < 2; y ++) {
//        cout << b[id][x][y] << " ";
//      }
//    }
//    cout << "\n";
  }

  void update(int i, ll val) {
//    cout << "update " << i << " " << val << "\n";
    _update(1, 1, n, i, val);
  }
}seg;

signed main() {
  if (fopen(NAME".inp", "r")) {
    freopen(NAME".inp", "r", stdin);
    freopen(NAME".out", "w", stdout);
  }
  cin.tie(0)->sync_with_stdio(0);

  int n, q;
  cin >> n >> q;
  seg.init(n - 1);
  ft.init(n);

  for (int i = 1; i <= n; i ++) {
    ll x;
    cin >> x;
    ft.update(i, x);
    ft.update(i + 1, -x);
  }

  for (int i = 2; i <= n; i ++) {
    seg.update(i - 1, ft.get(i) - ft.get(i - 1));
  }

  for (; q --;) {
    int l, r, x;
    cin >> l >> r >> x;
    ft.update(l, x);
    ft.update(r + 1, -x);

    seg.update(l - 1, ft.get(l) - ft.get(l - 1));
    if (r + 1 <= n) {
      seg.update(r, ft.get(r + 1) - ft.get(r));
    }
    ll ans = -inf;
    for (int l = 0; l < 2; l ++) {
      for (int r = 0; r < 2; r ++) {
        ans = max(ans, seg.b[1][l][r]);
      }
    }

    cout << ans << "\n";
  }

  return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:117:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  117 |     freopen(NAME".inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:118:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |     freopen(NAME".out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...