Problem p03519 (C++)

Buggy submission (status: Runtime Error):
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"
using namespace std;
#define FOR(i, j, k) for (int(i) = (j); (i) < (int)(k); ++(i))
#define rep(i, j) FOR(i, 0, j)
#define each(x, y) for (auto &(x) : (y))
#define mp make_pair
#define MT make_tuple
#define all(x) (x).begin(), (x).end()
#define debug(x) cout << #x << ": " << (x) << endl
#define smax(x, y) (x) = max((x), (y))
#define smin(x, y) (x) = min((x), (y))
#define MEM(x, y) memset((x), (y), sizeof(x))
#define sz(x) (int)(x).size()
#define RT return
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;

/*
セグメント木

int _query(int a, int b, int k, int l, int r)
[a,b)
l,rは今見ている範囲
内部で呼ぶだけ
コンストラクタ
要素数、初期値, 隣接要素を引数とする関数
query(int a, int b)
クエリ[a,b), 0Origin
int cal(int a, int b)
*/
template <class Value> class SegmentTree {
  int n;
  Value e;
  vector<Value> dat;
  function<Value(Value, Value)> f;

  inline Value query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l)
      return e;
    if (a <= l && r <= b)
      return dat[k];
    else {
      Value vl, vr;
      vl = query(a, b, k << 1, l, (l + r) >> 1);
      vr = query(a, b, (k << 1) | 1, (l + r) >> 1, r);
      return f(vl, vr);
    }
  }

public:
  SegmentTree() {}

  SegmentTree(int n_, Value init_, function<Value(Value, Value)> f_)
      : n(1), e(init_), f(f_) {
    for (; n < n_; n <<= 1)
      ;
    dat = vector<Value>(n << 1, e);
  }

  void update(int k, Value a) {
    k += n;
    dat[k] = a;
    while (k > 1) {
      k >>= 1;
      dat[k] = f(dat[k << 1], dat[(k << 1) | 1]);
    }
  }

  Value query(int a, int b) { return query(a, b, 1, 0, n); }
};

using P = array<ll, 2>;
P f(P p, P q) {
  P r;
  r[0] = max(p[0] + q[0], p[1] + q[1]);
  r[1] = max(p[0] + q[1], p[1] + q[0]);
  return r;
}
const ll MI = LLONG_MIN / 3;
using ST = SegmentTree<P>;

void solve() {
  int N, Q;
  cin >> N >> Q;

  vi A(N), B(N);
  rep(i, 2 * N) cin >> A[i];
  rep(i, 2 * N) cin >> B[i];

  P e{0, MI};
  ST st(2 * N, e, f);

  rep(i, 2 * N) { st.update(i, P{A[i], B[i]}); }
  rep(i, Q) {
    int p, x, y;
    cin >> p >> x >> y;
    p--;
    A[p] = x;
    B[p] = y;
    st.update(p, P{x, y});
    ll ans = A[0] + A[2 * N - 1] + st.query(1, 2 * N - 1)[0];
    cout << ans << endl;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(15);
  solve();
  return 0;
}

Fixed submission:
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"
using namespace std;
#define FOR(i, j, k) for (int(i) = (j); (i) < (int)(k); ++(i))
#define rep(i, j) FOR(i, 0, j)
#define each(x, y) for (auto &(x) : (y))
#define mp make_pair
#define MT make_tuple
#define all(x) (x).begin(), (x).end()
#define debug(x) cout << #x << ": " << (x) << endl
#define smax(x, y) (x) = max((x), (y))
#define smin(x, y) (x) = min((x), (y))
#define MEM(x, y) memset((x), (y), sizeof(x))
#define sz(x) (int)(x).size()
#define RT return
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;

/*
セグメント木

int _query(int a, int b, int k, int l, int r)
[a,b)
l,rは今見ている範囲
内部で呼ぶだけ
コンストラクタ
要素数、初期値, 隣接要素を引数とする関数
query(int a, int b)
クエリ[a,b), 0Origin
int cal(int a, int b)
*/
template <class Value> class SegmentTree {
  int n;
  Value e;
  vector<Value> dat;
  function<Value(Value, Value)> f;

  inline Value query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l)
      return e;
    if (a <= l && r <= b)
      return dat[k];
    else {
      Value vl, vr;
      vl = query(a, b, k << 1, l, (l + r) >> 1);
      vr = query(a, b, (k << 1) | 1, (l + r) >> 1, r);
      return f(vl, vr);
    }
  }

public:
  SegmentTree() {}

  SegmentTree(int n_, Value init_, function<Value(Value, Value)> f_)
      : n(1), e(init_), f(f_) {
    for (; n < n_; n <<= 1)
      ;
    dat = vector<Value>(n << 1, e);
  }

  void update(int k, Value a) {
    k += n;
    dat[k] = a;
    while (k > 1) {
      k >>= 1;
      dat[k] = f(dat[k << 1], dat[(k << 1) | 1]);
    }
  }

  Value query(int a, int b) { return query(a, b, 1, 0, n); }
};

using P = array<ll, 2>;
P f(P p, P q) {
  P r;
  r[0] = max(p[0] + q[0], p[1] + q[1]);
  r[1] = max(p[0] + q[1], p[1] + q[0]);
  return r;
}
const ll MI = LLONG_MIN / 3;
using ST = SegmentTree<P>;

void solve() {
  int N, Q;
  cin >> N >> Q;

  vi A(2 * N), B(2 * N);
  rep(i, 2 * N) cin >> A[i];
  rep(i, 2 * N) cin >> B[i];

  P e{0, MI};
  ST st(2 * N, e, f);

  rep(i, 2 * N) { st.update(i, P{A[i], B[i]}); }
  rep(i, Q) {
    int p, x, y;
    cin >> p >> x >> y;
    p--;
    A[p] = x;
    B[p] = y;
    st.update(p, P{x, y});
    ll ans = A[0] + A[2 * N - 1] + st.query(1, 2 * N - 1)[0];
    cout << ans << endl;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(15);
  solve();
  return 0;
}