Problem p03641 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

#define REP(i, n) for (long long i = 0; i < (n); i++)
#define FOR(i, m, n) for (long long i = (m); i < (n); ++i)
#define ALL(obj) (obj).begin(), (obj).end()
#define SPEED                                                                  \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false);

template <class T> using V = vector<T>;
template <class T, class U> using P = pair<T, U>;
template <class T> using PQ = priority_queue<T>;
template <class T> using PQR = priority_queue<T, vector<T>, greater<T>>;

constexpr long long MOD = (long long)1e9 + 7;
constexpr long long MOD2 = 998244353;
constexpr long long HIGHINF = (long long)1e18;
constexpr long long LOWINF = (long long)1e15;
constexpr long double PI = 3.1415926535897932384626433;

template <class T> vector<T> make_v(size_t N, T init) {
  return vector<T>(N, init);
}
template <class... T> auto make_v(size_t N, T... t) {
  return vector<decltype(make_v(t...))>(N, make_v(t...));
}
template <class T> void corner(bool flg, T hoge) {
  if (flg) {
    cout << hoge << endl;
    exit(0);
  }
}
template <class T, class U>
ostream &operator<<(ostream &o, const map<T, U> &obj) {
  o << "{";
  for (auto &x : obj)
    o << " {" << x.first << " : " << x.second << "}"
      << ",";
  o << " }";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const multiset<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << "{";
  for (int i = 0; i < (int)obj.size(); ++i)
    o << (i > 0 ? ", " : "") << obj[i];
  o << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const pair<T, U> &obj) {
  o << "{" << obj.first << ", " << obj.second << "}";
  return o;
}
template <template <class tmp> class T, class U>
ostream &operator<<(ostream &o, const T<U> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
void print(void) { cout << endl; }
template <class Head> void print(Head &&head) {
  cout << head;
  print();
}
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  cout << head << " ";
  print(forward<Tail>(tail)...);
}
template <class T> void chmax(T &a, const T b) { a = max(a, b); }
template <class T> void chmin(T &a, const T b) { a = min(a, b); }
void YN(bool flg) { cout << (flg ? "YES" : "NO") << endl; }
void Yn(bool flg) { cout << (flg ? "Yes" : "No") << endl; }
void yn(bool flg) { cout << (flg ? "yes" : "no") << endl; }

template <class T> class Segment_Tree_Range_Minimum_Query {
  size_t N, M;
  T ini;
  vector<T> node;

public:
  Segment_Tree_Range_Minimum_Query(const vector<T> &ar, const T ini)
      : M(ar.size()), ini(ini) {
    for (N = 1; N < M; N *= 2)
      ;
    node.resize(2 * N - 1, ini);
    for (int i = 0; i < M; ++i)
      node[i + N - 1] = ar[i];
    for (int i = N - 2; i >= 0; --i)
      node[i] = min(node[2 * i + 1], node[2 * i + 2]);
  }

  Segment_Tree_Range_Minimum_Query(const size_t M, const T ini)
      : M(M), ini(ini) {
    for (N = 1; N < M; N *= 2)
      ;
    node.resize(2 * N - 1, ini);
  }

  void update(size_t idx, const T var) {
    idx += (N - 1);
    node[idx] = var;
    while (idx > 0) {
      idx = (idx - 1) / 2;
      node[idx] = min(node[2 * idx + 1], node[2 * idx + 2]);
    }
  }

  T getvar(const int a, const int b, int k = 0, int l = 0, int r = -1) {
    if (r < 0)
      r = N;
    if (r <= a || b <= l)
      return ini;
    if (a <= l && r <= b)
      return node[k];
    T vl = getvar(a, b, 2 * k + 1, l, (l + r) / 2);
    T vr = getvar(a, b, 2 * k + 2, (l + r) / 2, r);
    return min(vl, vr);
  }

  T operator[](size_t idx) { return node[idx + N - 1]; }

  T operator[](pair<size_t, size_t> p) { return getvar(p.first, p.second); }

  void print() {
    cout << "{ " << getvar(0, 1);
    for (int i = 1; i < M; ++i)
      cout << ", " << getvar(i, i + 1);
    cout << " }" << endl;
  }
};

const int MAX_N = 10;
int N;
vector<int> A(MAX_N);
vector<vector<int>> edge(MAX_N);
vector<int> match(MAX_N, -1);

Segment_Tree_Range_Minimum_Query<pair<int, int>> SegL(MAX_N, {MAX_N, MAX_N}),
    SegR(MAX_N, {MAX_N, MAX_N});

pair<int, int> rec(int l, int r) {

  auto e1 = (l % 2 ? SegR : SegL).getvar(l, r + 1);
  int s = e1.second;
  auto e2 = (l % 2 ? SegL : SegR).getvar(s, r + 1);
  int t = e2.second;
  match[s] = t;

  if (0 <= l && l <= s - 1 && s - 1 <= r && r < N) {
    pair<int, int> vl = rec(l, s - 1);
    edge[s].push_back(vl.first);
  }
  if (0 <= l && l <= s + 1 && s + 1 < t - 1 && t - 1 <= r && r < N) {
    pair<int, int> vc = rec(s + 1, t - 1);
    edge[s].push_back(vc.first);
  }
  if (0 <= l && l <= t + 1 && t + 1 < r && r < N) {
    pair<int, int> vr = rec(t + 1, r);
    edge[s].push_back(vr.first);
  }
  pair<int, int> ret = {s, t};
  return ret;
}

int main() {
  cin >> N;
  for (int i = 0; i < N; ++i)
    cin >> A[i];
  for (int i = 0; i < N; ++i)
    (i % 2 ? SegR : SegL).update(i, {A[i], i});
  auto p = rec(0, N - 1);
  PQR<pair<int, int>> pq;
  pq.push({A[p.first], p.first});
  vector<int> ans;
  while (pq.size()) {
    auto from = pq.top().second;
    pq.pop();
    ans.push_back(A[from]);
    ans.push_back(A[match[from]]);
    for (auto to : edge[from])
      pq.push({A[to], to});
  }
  for (auto e : ans)
    cout << e << " ";
  cout << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

#define REP(i, n) for (long long i = 0; i < (n); i++)
#define FOR(i, m, n) for (long long i = (m); i < (n); ++i)
#define ALL(obj) (obj).begin(), (obj).end()
#define SPEED                                                                  \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false);

template <class T> using V = vector<T>;
template <class T, class U> using P = pair<T, U>;
template <class T> using PQ = priority_queue<T>;
template <class T> using PQR = priority_queue<T, vector<T>, greater<T>>;

constexpr long long MOD = (long long)1e9 + 7;
constexpr long long MOD2 = 998244353;
constexpr long long HIGHINF = (long long)1e18;
constexpr long long LOWINF = (long long)1e15;
constexpr long double PI = 3.1415926535897932384626433;

template <class T> vector<T> make_v(size_t N, T init) {
  return vector<T>(N, init);
}
template <class... T> auto make_v(size_t N, T... t) {
  return vector<decltype(make_v(t...))>(N, make_v(t...));
}
template <class T> void corner(bool flg, T hoge) {
  if (flg) {
    cout << hoge << endl;
    exit(0);
  }
}
template <class T, class U>
ostream &operator<<(ostream &o, const map<T, U> &obj) {
  o << "{";
  for (auto &x : obj)
    o << " {" << x.first << " : " << x.second << "}"
      << ",";
  o << " }";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const multiset<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << "{";
  for (int i = 0; i < (int)obj.size(); ++i)
    o << (i > 0 ? ", " : "") << obj[i];
  o << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const pair<T, U> &obj) {
  o << "{" << obj.first << ", " << obj.second << "}";
  return o;
}
template <template <class tmp> class T, class U>
ostream &operator<<(ostream &o, const T<U> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
void print(void) { cout << endl; }
template <class Head> void print(Head &&head) {
  cout << head;
  print();
}
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  cout << head << " ";
  print(forward<Tail>(tail)...);
}
template <class T> void chmax(T &a, const T b) { a = max(a, b); }
template <class T> void chmin(T &a, const T b) { a = min(a, b); }
void YN(bool flg) { cout << (flg ? "YES" : "NO") << endl; }
void Yn(bool flg) { cout << (flg ? "Yes" : "No") << endl; }
void yn(bool flg) { cout << (flg ? "yes" : "no") << endl; }

template <class T> class Segment_Tree_Range_Minimum_Query {
  size_t N, M;
  T ini;
  vector<T> node;

public:
  Segment_Tree_Range_Minimum_Query(const vector<T> &ar, const T ini)
      : M(ar.size()), ini(ini) {
    for (N = 1; N < M; N *= 2)
      ;
    node.resize(2 * N - 1, ini);
    for (int i = 0; i < M; ++i)
      node[i + N - 1] = ar[i];
    for (int i = N - 2; i >= 0; --i)
      node[i] = min(node[2 * i + 1], node[2 * i + 2]);
  }

  Segment_Tree_Range_Minimum_Query(const size_t M, const T ini)
      : M(M), ini(ini) {
    for (N = 1; N < M; N *= 2)
      ;
    node.resize(2 * N - 1, ini);
  }

  void update(size_t idx, const T var) {
    idx += (N - 1);
    node[idx] = var;
    while (idx > 0) {
      idx = (idx - 1) / 2;
      node[idx] = min(node[2 * idx + 1], node[2 * idx + 2]);
    }
  }

  T getvar(const int a, const int b, int k = 0, int l = 0, int r = -1) {
    if (r < 0)
      r = N;
    if (r <= a || b <= l)
      return ini;
    if (a <= l && r <= b)
      return node[k];
    T vl = getvar(a, b, 2 * k + 1, l, (l + r) / 2);
    T vr = getvar(a, b, 2 * k + 2, (l + r) / 2, r);
    return min(vl, vr);
  }

  T operator[](size_t idx) { return node[idx + N - 1]; }

  T operator[](pair<size_t, size_t> p) { return getvar(p.first, p.second); }

  void print() {
    cout << "{ " << getvar(0, 1);
    for (int i = 1; i < M; ++i)
      cout << ", " << getvar(i, i + 1);
    cout << " }" << endl;
  }
};

const int MAX_N = 200010;
int N;
vector<int> A(MAX_N);
vector<vector<int>> edge(MAX_N);
vector<int> match(MAX_N, -1);

Segment_Tree_Range_Minimum_Query<pair<int, int>> SegL(MAX_N, {MAX_N, MAX_N}),
    SegR(MAX_N, {MAX_N, MAX_N});

pair<int, int> rec(int l, int r) {

  auto e1 = (l % 2 ? SegR : SegL).getvar(l, r + 1);
  int s = e1.second;
  auto e2 = (l % 2 ? SegL : SegR).getvar(s, r + 1);
  int t = e2.second;
  match[s] = t;

  if (0 <= l && l <= s - 1 && s - 1 <= r && r < N) {
    pair<int, int> vl = rec(l, s - 1);
    edge[s].push_back(vl.first);
  }
  if (0 <= l && l <= s + 1 && s + 1 < t - 1 && t - 1 <= r && r < N) {
    pair<int, int> vc = rec(s + 1, t - 1);
    edge[s].push_back(vc.first);
  }
  if (0 <= l && l <= t + 1 && t + 1 < r && r < N) {
    pair<int, int> vr = rec(t + 1, r);
    edge[s].push_back(vr.first);
  }
  pair<int, int> ret = {s, t};
  return ret;
}

int main() {
  cin >> N;
  for (int i = 0; i < N; ++i)
    cin >> A[i];
  for (int i = 0; i < N; ++i)
    (i % 2 ? SegR : SegL).update(i, {A[i], i});
  auto p = rec(0, N - 1);
  PQR<pair<int, int>> pq;
  pq.push({A[p.first], p.first});
  vector<int> ans;
  while (pq.size()) {
    auto from = pq.top().second;
    pq.pop();
    ans.push_back(A[from]);
    ans.push_back(A[match[from]]);
    for (auto to : edge[from])
      pq.push({A[to], to});
  }
  for (auto e : ans)
    cout << e << " ";
  cout << endl;

  return 0;
}