Problem p03132 (C++)

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

#define int long long
#define vvi vector<vector<int>>
#define vec vector
#define pq priority_queue
#define all(v) (v).begin(), (v).end()
#define uniqueV(x)                                                             \
  sort(x.begin(), x.end());                                                    \
  x.erase(unique(x.begin(), x.end()), x.end());
#define rep(i, n) for (int(i) = (0); (i) < (n); ++(i))
#define repp(i, m, n) for (int(i) = (m); (i) < (n); ++(i))
#define dbg(x) cerr << #x << ": " << x << endl;
#define dbg2(x, y)                                                             \
  cerr << "(" << #x << ", " << #y << ") = "                                    \
       << "(" << x << ", " << y << ")" << endl;
#define dbg3(x, y, z)                                                          \
  cerr << "(" << #x << ", " << #y << ", " << #z << ") = "                      \
       << "(" << x << ", " << y << ", " << z << ")" << endl;
#define dbgB(value, size) cerr << #value << ": " << bitset<size>(value) << endl;
#define line() cerr << "---------------" << endl;

const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const double PI = 3.14159265358979323846;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename T> void print1(T begin, T end) {
  while (begin != end) {
    cout << (*begin) << " ";
    *begin++;
  }
  cout << endl;
}

template <typename T> void print2(T Array, int height, int width) {
  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      cout << " " << Array[i][j];
    }
    cout << endl;
  }
}

void print() { std::cerr << endl; }
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  std::cerr << head << " ";
  print(std::forward<Tail>(tail)...);
}

template <class T> void Add(T &a, const T &b, const T &mod = 1e9 + 7) {
  int val = ((a % mod) + (b % mod)) % mod;
  if (val < 0) {
    val += mod;
  }
  a = val;
}

// ------------------------------------------------------------------------------------------

const int INF = 1e18;

int score(int a, int t) {
  if (t == 0 || t == 4)
    return a;
  if (t == 1 || t == 3) {
    if (a == 0)
      return 2;
    return a % 2;
  }
  return (a + 1) % 2;
}

int A[111111];
int dp[111111][5];

signed main() {
  int n;
  cin >> n;
  rep(i, n) cin >> A[i];
  rep(i, n + 1) rep(j, 5) dp[i][j] = INF;
  rep(j, 5) dp[0][j] = 0;

  rep(i, n) {
    rep(j, 5) {
      if (j > 0)
        dp[i][j] = min(dp[i][j], dp[i][j - 1]);
      dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + score(A[i], j));
    }
  }

  int ret = INF;
  rep(i, 5) { ret = min(ret, dp[n][i]); }

  cout << ret << endl;

  return 0;
}

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

#define int long long
#define vvi vector<vector<int>>
#define vec vector
#define pq priority_queue
#define all(v) (v).begin(), (v).end()
#define uniqueV(x)                                                             \
  sort(x.begin(), x.end());                                                    \
  x.erase(unique(x.begin(), x.end()), x.end());
#define rep(i, n) for (int(i) = (0); (i) < (n); ++(i))
#define repp(i, m, n) for (int(i) = (m); (i) < (n); ++(i))
#define dbg(x) cerr << #x << ": " << x << endl;
#define dbg2(x, y)                                                             \
  cerr << "(" << #x << ", " << #y << ") = "                                    \
       << "(" << x << ", " << y << ")" << endl;
#define dbg3(x, y, z)                                                          \
  cerr << "(" << #x << ", " << #y << ", " << #z << ") = "                      \
       << "(" << x << ", " << y << ", " << z << ")" << endl;
#define dbgB(value, size) cerr << #value << ": " << bitset<size>(value) << endl;
#define line() cerr << "---------------" << endl;

const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const double PI = 3.14159265358979323846;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename T> void print1(T begin, T end) {
  while (begin != end) {
    cout << (*begin) << " ";
    *begin++;
  }
  cout << endl;
}

template <typename T> void print2(T Array, int height, int width) {
  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      cout << " " << Array[i][j];
    }
    cout << endl;
  }
}

void print() { std::cerr << endl; }
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  std::cerr << head << " ";
  print(std::forward<Tail>(tail)...);
}

template <class T> void Add(T &a, const T &b, const T &mod = 1e9 + 7) {
  int val = ((a % mod) + (b % mod)) % mod;
  if (val < 0) {
    val += mod;
  }
  a = val;
}

// ------------------------------------------------------------------------------------------

const int INF = 1e18;

int score(int a, int t) {
  if (t == 0 || t == 4)
    return a;
  if (t == 1 || t == 3) {
    if (a == 0)
      return 2;
    return a % 2;
  }
  return (a + 1) % 2;
}

int A[222222];
int dp[222222][5];

signed main() {
  int n;
  cin >> n;
  rep(i, n) cin >> A[i];
  rep(i, n + 1) rep(j, 5) dp[i][j] = INF;
  rep(j, 5) dp[0][j] = 0;

  rep(i, n) {
    rep(j, 5) {
      if (j > 0)
        dp[i][j] = min(dp[i][j], dp[i][j - 1]);
      dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + score(A[i], j));
    }
  }

  int ret = INF;
  rep(i, 5) { ret = min(ret, dp[n][i]); }

  cout << ret << endl;

  return 0;
}