Problem p02349 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = 1e18;
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &o) {
  out << "(" << o.first << "," << o.second << ")";
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> V) {
  for (int i = 0; i < V.size(); i++) {
    out << V[i];
    if (i != V.size() - 1)
      out << " ";
  }
  return out;
}
template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> Mat) {
  for (int i = 0; i < Mat.size(); i++) {
    if (i != 0)
      out << endl;
    out << Mat[i];
  }
  return out;
}
template <class S, class T>
ostream &operator<<(ostream &out, const map<S, T> mp) {
  out << "{ ";
  for (auto it = mp.begin(); it != mp.end(); it++) {
    out << it->first << ":" << it->second;
    if (mp.size() - 1 != distance(mp.begin(), it))
      out << ", ";
  }
  out << " }";
  return out;
}

// ================================================= //

/*starry sky tree
 add(O(logN)):区間[a, b)に値xを加算する
 getMin(O(logN)): 区間の最小値を得る
 */
static const int MAX_SIZE = 100050;
typedef long long ll;
ll segMin[2 * MAX_SIZE - 1], segAdd[2 * MAX_SIZE - 1];

void add(int a, int b, int x, int k = 0, int l = 0, int r = MAX_SIZE) {
  if (r <= a || b <= l)
    return; // もし交差しない区間であれば終える.

  if (a <= l &&
      r <= b) { // もし今みている区間[l, r)が[a, b)に完全に内包されていれば
    segAdd[k] += x; // 区間[l, r)にkを加算する.
    return;
  }

  // 子の区間に(必要があれば)xを加算する.
  add(a, b, x, k * 2 + 1, l, (l + r) / 2);
  add(a, b, x, k * 2 + 2, (l + r) / 2, r);

  // 親の区間の最小値は, 子の区間の最小値 + 自分に一様に加算されている値
  // である.一様に加算される値は更新しなくて良い.
  segMin[k] = min(segMin[k * 2 + 1] + segAdd[k * 2 + 1],
                  segMin[k * 2 + 2] + segAdd[k * 2 + 2]);
}

ll getMin(int a, int b, int k = 0, int l = 0, int r = MAX_SIZE) {
  if (r <= a || b <= l)
    return (LLONG_MAX);
  if (a <= l && r <= b)
    return (segMin[k] +
            segAdd[k]); // 完全に内包されていれば,その区間の最小値を返す.

  ll left = getMin(a, b, k * 2 + 1, l, (l + r) / 2); // 子の区間の最小値を求める.
  ll right = getMin(a, b, k * 2 + 2, (l + r) / 2, r); // 子の区間の最小値を求める

  // 親の区間の最小値は, 子の区間の最小値 + 自分に一様に加算されている値
  return (min(left, right) + segAdd[k]);
}

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, q;
  cin >> n >> q;

  //    SegTree ST(n);
  //    BIT bit(n);
  while (q--) {
    int com;
    cin >> com;
    if (com == 0) {
      int s, t, x;
      cin >> s >> t >> x;
      // ST.update(s-1,t,x);
      add(s - 1, t, x);
    } else {
      int i;
      cin >> i;
      // cout << ST.query(i-1,i) << endl;
      cout << getMin(i - 1, i) << endl;
    }
  }

  return 0;
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = 1e18;
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &o) {
  out << "(" << o.first << "," << o.second << ")";
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> V) {
  for (int i = 0; i < V.size(); i++) {
    out << V[i];
    if (i != V.size() - 1)
      out << " ";
  }
  return out;
}
template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> Mat) {
  for (int i = 0; i < Mat.size(); i++) {
    if (i != 0)
      out << endl;
    out << Mat[i];
  }
  return out;
}
template <class S, class T>
ostream &operator<<(ostream &out, const map<S, T> mp) {
  out << "{ ";
  for (auto it = mp.begin(); it != mp.end(); it++) {
    out << it->first << ":" << it->second;
    if (mp.size() - 1 != distance(mp.begin(), it))
      out << ", ";
  }
  out << " }";
  return out;
}

// ================================================= //

/*starry sky tree
 add(O(logN)):区間[a, b)に値xを加算する
 getMin(O(logN)): 区間の最小値を得る
 */
static const int MAX_SIZE = 1 << 17;
typedef long long ll;
ll segMin[2 * MAX_SIZE - 1], segAdd[2 * MAX_SIZE - 1];

void add(int a, int b, int x, int k = 0, int l = 0, int r = MAX_SIZE) {
  if (r <= a || b <= l)
    return; // もし交差しない区間であれば終える.

  if (a <= l &&
      r <= b) { // もし今みている区間[l, r)が[a, b)に完全に内包されていれば
    segAdd[k] += x; // 区間[l, r)にkを加算する.
    return;
  }

  // 子の区間に(必要があれば)xを加算する.
  add(a, b, x, k * 2 + 1, l, (l + r) / 2);
  add(a, b, x, k * 2 + 2, (l + r) / 2, r);

  // 親の区間の最小値は, 子の区間の最小値 + 自分に一様に加算されている値
  // である.一様に加算される値は更新しなくて良い.
  segMin[k] = min(segMin[k * 2 + 1] + segAdd[k * 2 + 1],
                  segMin[k * 2 + 2] + segAdd[k * 2 + 2]);
}

ll getMin(int a, int b, int k = 0, int l = 0, int r = MAX_SIZE) {
  if (r <= a || b <= l)
    return (LLONG_MAX);
  if (a <= l && r <= b)
    return (segMin[k] +
            segAdd[k]); // 完全に内包されていれば,その区間の最小値を返す.

  ll left = getMin(a, b, k * 2 + 1, l, (l + r) / 2); // 子の区間の最小値を求める.
  ll right = getMin(a, b, k * 2 + 2, (l + r) / 2, r); // 子の区間の最小値を求める

  // 親の区間の最小値は, 子の区間の最小値 + 自分に一様に加算されている値
  return (min(left, right) + segAdd[k]);
}

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, q;
  cin >> n >> q;

  //    SegTree ST(n);
  //    BIT bit(n);
  while (q--) {
    int com;
    cin >> com;
    if (com == 0) {
      int s, t, x;
      cin >> s >> t >> x;
      // ST.update(s-1,t,x);
      add(s - 1, t, x);
    } else {
      int i;
      cin >> i;
      // cout << ST.query(i-1,i) << endl;
      cout << getMin(i - 1, i) << endl;
    }
  }

  return 0;
}