Problem p03890 (C++)

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

using ll = long long;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using vint = vector<int>;
using vvint = vector<vint>;
using vvvint = vector<vvint>;
using vll = vector<ll>;
using uint = unsigned int;
using ull = unsigned long long;

template <typename T> using uset = unordered_set<T>;
template <typename T1, typename T2> using umap = unordered_map<T1, T2>;

constexpr int INF = (1 << 30) - 1;
constexpr ll LLINF = 1LL << 60;
constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};
constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
constexpr char el = '\n';
constexpr int mod = 1000000007;

template <typename T> T gcd(T a, T b) { return (b ? gcd(b, a % b) : a); }
template <typename T> T lcm(T a, T b) { return (a / gcd(a, b) * b); }
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (auto &u : v)
    os << u << el;
  return (os);
}

template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &u : v)
    is >> u;
  return (is);
}

template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  return (is >> p.first >> p.second);
}

int main() {
  int N;
  cin >> N;
  vint A(1 << N);
  cin >> A;

  for (int i = 0; i < N; i++) {
    vint B(1 << (N - i - 1));
    for (int j = 0; j < (1 << N); j += 2) {
      if (A[j] > A[j + 1]) {
        B[j >> 1] = A[j] - A[j + 1];
      } else if (A[j] == A[j + 1]) {
        B[j >> 1] = A[j];
      } else {
        B[j >> 1] = A[j + 1] - A[j];
      }
    }
    A = B;
  }
  cout << A[0] << endl;
  return (0);
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using vint = vector<int>;
using vvint = vector<vint>;
using vvvint = vector<vvint>;
using vll = vector<ll>;
using uint = unsigned int;
using ull = unsigned long long;

template <typename T> using uset = unordered_set<T>;
template <typename T1, typename T2> using umap = unordered_map<T1, T2>;

constexpr int INF = (1 << 30) - 1;
constexpr ll LLINF = 1LL << 60;
constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};
constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
constexpr char el = '\n';
constexpr int mod = 1000000007;

template <typename T> T gcd(T a, T b) { return (b ? gcd(b, a % b) : a); }
template <typename T> T lcm(T a, T b) { return (a / gcd(a, b) * b); }
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (auto &u : v)
    os << u << el;
  return (os);
}

template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &u : v)
    is >> u;
  return (is);
}

template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  return (is >> p.first >> p.second);
}

int main() {
  int N;
  cin >> N;
  vint A(1 << N);
  cin >> A;

  for (int i = 0; i < N; i++) {
    vint B(1 << (N - i - 1));
    for (int j = 0; j < (1 << (N - i)); j += 2) {
      if (A[j] > A[j + 1]) {
        B[j >> 1] = A[j] - A[j + 1];
      } else if (A[j] == A[j + 1]) {
        B[j >> 1] = A[j];
      } else {
        B[j >> 1] = A[j + 1] - A[j];
      }
    }
    A = B;
  }
  cout << A[0] << endl;
  return (0);
}