Problem p02686 (C++) — buggy submission, verdict: Runtime Error

#line 2 "header.hpp"

//%snippet.set('header')%
//%snippet.fold()%
#ifndef HEADER_H
#define HEADER_H

// template version 2.0
using namespace std;
#include <bits/stdc++.h>

// varibable settings
const long long INF = 1e18;

#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (ll i = (ll)(a); i < (ll)(b); ++i)
#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define _rrep(i, n) rrepi(i, 0, n)
#define rrepi(i, a, b) for (ll i = (ll)((b)-1); i >= (ll)(a); --i)
#define r_rep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define each(i, a) for (auto &&i : a)
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define mt(...) make_tuple(__VA_ARGS__)
#define ub upper_bound
#define lb lower_bound
#define lpos(A, x) (lower_bound(all(A), x) - A.begin())
#define upos(A, x) (upper_bound(all(A), x) - A.begin())
template <class T> inline void chmax(T &a, const T &b) {
  if ((a) < (b))
    (a) = (b);
}
template <class T> inline void chmin(T &a, const T &b) {
  if ((a) > (b))
    (a) = (b);
}

#define divceil(a, b) ((a) + (b)-1) / (b)
#define is_in(x, a, b) ((a) <= (x) && (x) < (b))
#define uni(x)                                                                 \\
  sort(all(x));                                                                \\
  x.erase(unique(all(x)), x.end())
#define slice(l, r) substr(l, r - l)

typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<ll, ll> pii;
typedef tuple<ll, ll, ll> iii;

template <typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
struct Fast {
  Fast() {
    std::cin.tie(0);
    ios::sync_with_stdio(false);
  }
} fast;
void check_input() {
  assert(cin.eof() == 0);
  int tmp;
  cin >> tmp;
  assert(cin.eof() == 1);
}

#if defined(PCM) || defined(LOCAL)
#else
#define dump(...) ;
#define dump_1d(...) ;
#define dump_2d(...) ;
#define cerrendl ;
#endif

#endif /* HEADER_H */
//%snippet.end()%
#line 2 "solve2.cpp"

int main() {
  int n;
  cin >> n;
  vi min(n), total(n);
  vector<pii> fh;
  vector<pii> sh;
  rep(i, n) {
    string s;
    cin >> s;
    int m = sz(s);
    rep(j, m) {
      if (s[j] == '(') {
        total[i]++;
      }
      if (s[j] == ')') {
        total[i]--;
        chmin(min[i], total[i]);
      }
    }
    if (total[i] > 0)
      fh.pb(mp(min[i], total[i]));
    else
      sh.pb(mp(min[i], total[i]));
  }
  dump(total);
  dump(accumulate(all(total), 0LL));
  if (accumulate(all(total), 0LL) != 0) {
    cout << "No" << endl;
    return 0;
  }

  sort(all(fh), [&](auto &l, auto &r) { return l.first > r.first; });
  sort(all(sh), [&](auto &l, auto &r) {
    return l.second - l.first > r.second - r.first;
  });
  dump(fh);
  dump(sh);

  int cur = 0;
  rep(i, sz(fh)) {
    auto [m, t] = fh[i];
    if (cur + m < 0) {
      cout << "No" << endl;
      return 0;
    }
    cur += t;
  }
  rep(i, sz(sh)) {
    auto [m, t] = sh[i];
    if (cur + m < 0) {
      cout << "No" << endl;
      return 0;
    }
    cur += t;
  }
  cout << "Yes" << endl;
  return 0;
}


Error: -6
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc


Fixed submission:

#line 2 "header.hpp"

//%snippet.set('header')%
//%snippet.fold()%
#ifndef HEADER_H
#define HEADER_H

// template version 2.0
using namespace std;
#include <bits/stdc++.h>

// varibable settings
const long long INF = 1e18;

#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (ll i = (ll)(a); i < (ll)(b); ++i)
#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define _rrep(i, n) rrepi(i, 0, n)
#define rrepi(i, a, b) for (ll i = (ll)((b)-1); i >= (ll)(a); --i)
#define r_rep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define each(i, a) for (auto &&i : a)
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define mt(...) make_tuple(__VA_ARGS__)
#define ub upper_bound
#define lb lower_bound
#define lpos(A, x) (lower_bound(all(A), x) - A.begin())
#define upos(A, x) (upper_bound(all(A), x) - A.begin())
template <class T> inline void chmax(T &a, const T &b) {
  if ((a) < (b))
    (a) = (b);
}
template <class T> inline void chmin(T &a, const T &b) {
  if ((a) > (b))
    (a) = (b);
}

#define divceil(a, b) ((a) + (b)-1) / (b)
#define is_in(x, a, b) ((a) <= (x) && (x) < (b))
#define uni(x)                                                                 \\
  sort(all(x));                                                                \\
  x.erase(unique(all(x)), x.end())
#define slice(l, r) substr(l, r - l)

typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<ll, ll> pii;
typedef tuple<ll, ll, ll> iii;

template <typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
struct Fast {
  Fast() {
    std::cin.tie(0);
    ios::sync_with_stdio(false);
  }
} fast;
void check_input() {
  assert(cin.eof() == 0);
  int tmp;
  cin >> tmp;
  assert(cin.eof() == 1);
}

#if defined(PCM) || defined(LOCAL)
#else
#define dump(...) ;
#define dump_1d(...) ;
#define dump_2d(...) ;
#define cerrendl ;
#endif

#endif /* HEADER_H */
//%snippet.end()%
#line 2 "solve.cpp"

// snippet:segment_tree {{{
template <typename T> struct SegmentTree { // {{{
private:
  using F = function<T(T, T)>;
  int n; // 元の配列のサイズ
  int N; // n以上の最小の2冪
  vector<T> node;
  F merge;
  T identity;

public:
  SegmentTree() {}
  SegmentTree(vector<T> a, F f, T id) : merge(f), identity(id) {
    n = a.size();
    N = 1;
    while (N < n)
      N *= 2;
    node.resize(2 * N - 1, identity);
    for (int i = 0; i < n; i++)
      node[i + N - 1] = a[i];
    for (int i = N - 2; i >= 0; i--)
      node[i] = merge(node[2 * i + 1], node[2 * i + 2]);
  }
  SegmentTree(int n, F f, T id) : SegmentTree(vector<T>(n, id), f, id) {}

  T &operator[](int i) { return node[i + N - 1]; }

  void update(int i, T val) {
    i += (N - 1);
    node[i] = val;
    while (i > 0) {
      i = (i - 1) / 2;
      node[i] = merge(node[2 * i + 1], node[2 * i + 2]);
    }
  }

  void add(int i, T val) {
    i += (N - 1);
    node[i] += val;
    while (i > 0) {
      i = (i - 1) / 2;
      node[i] = merge(node[2 * i + 1], node[2 * i + 2]);
    }
  }

  // query for [l, r)
  T query(int a, int b, int k = 0, int l = 0, int r = -1) {
    if (r < 0)
      r = N;
    if (r <= a || b <= l)
      return identity;
    if (a <= l && r <= b)
      return node[k];

    T vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
    T vr = query(a, b, 2 * k + 2, (l + r) / 2, r);
    return merge(vl, vr);
  }

#if defined(PCM) || defined(LOCAL)
  friend ostream &operator<<(ostream &os, SegmentTree<T> &sg) { //
    os << "[";
    for (int i = 0; i < sg.n; i++) {
      os << sg[i] << (i == sg.n - 1 ? "]\\n" : ", ");
    }
    return os;
  }
#endif
}; /*}}}*/
// sample of initialize SegmentTree:
// -----------------------------------------------
// auto mymin=[](auto a, auto b){return min(a,b);};
// SegmentTree<ll> seg(a, mymin, 1e18);

// auto add=[](auto a, auto b){return a+b;};
// SegmentTree<ll> seg(a, add, 0);
// -----------------------------------------------
// snippet:segment_tree }}}

int solve() {
  int n;
  cin >> n; /*{{{*/
  vector<string> s(n);

  vector<int> o_cnt(n);
  vector<int> c_cnt(n);
  vector<int> cnt(n);
  vector<int> minlevel(n, 0);
  rep(i, n) {
    cin >> s[i];
    int m = sz(s[i]);
    int level = 0;
    rep(j, m) {
      if (s[i][j] == '(') {
        o_cnt[i]++;
        level++;
      }
      if (s[i][j] == ')') {
        c_cnt[i]++;
        level--;
      }
      chmin(minlevel[i], level);
    }
    cnt[i] = o_cnt[i] - c_cnt[i];
  }
  dump(o_cnt);
  dump(c_cnt);
  dump(cnt);
  dump(minlevel);

  if (accumulate(all(cnt), 0) != 0) {
    cout << "No" << endl;
    return 0;
  }

  auto mymax = [](auto a, auto b) { return max(a, b); }; /*}}}*/

  const int VV = 2000005;
  const int V = 1000001;
  SegmentTree<pair<ll, ll>> seg(VV, mymax, mp(-1e18, -1e18));
  vector<priority_queue<ll>> num(VV);
  rep(i, n) { num[minlevel[i] + V].push(cnt[i]); }

  rep(ml, -1000001, 1000003) {
    if (sz(num[ml + V]) == 0)
      continue;
    ll x = num[ml + V].top();
    num[ml + V].pop();
    seg.update(ml + V, mp(x, ml + V));
  }

  ll cur = 0;
  rep(i, n) {
    cerrendl;
    auto [cnt_max, idx] = seg.query(-cur + V, VV);
    cur += cnt_max;
    if (idx == -2147483648) {
      cout << "No" << endl;
      return 0;
    }

    if (sz(num[idx]) == 0) {
      seg.update(idx, mp(-1e18, -1e18));
    } else {
      ll tmp = num[idx].top();
      num[idx].pop();
      seg.update(tmp, mp(tmp, idx));
    }
  }
  cout << "Yes" << endl;
  return 0;
}

int main() { /*{{{*/
  solve();
  check_input();
  return 0;
} /*}}}*/