Problem p03096 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
// #define DEBUG_MODE
#define endl '\n'
#ifdef DEBUG_MODE
#define DEBUG(X) debug_func(X, #X)
#define DEBUG_ENDL endl << flush
#define DEBUG_SEPARATOR_LINE cout << "=================\n"
#else
#define DEBUG(X) 0
#define DEBUG_ENDL 0
#define DEBUG_SEPARATOR_LINE 0
#endif
#define ALL(V) (V).begin(), (V).end()
#define ALLR(V) (V).rbegin(), (V).rend()
#define DEBUG_ENDL_S(S) ((S).size() ? "\n" : "") << flush;
template <typename T> using V = vector<T>;
template <typename T> using VV = V<V<T>>;
template <typename T, typename U> using P = pair<T, U>;
using ll = int64_t;
using PLL = P<ll, ll>;
template <typename T> const T &var_min(const T &t) { return t; }
template <typename T> const T &var_max(const T &t) { return t; }
template <typename Head, typename... Tail>
const Head &var_min(const Head &head, const Tail &...tail) {
  return min(head, var_min(tail...));
}
template <typename Head, typename... Tail>
const Head &var_max(const Head &head, const Tail &...tail) {
  return max(head, var_max(tail...));
}
template <typename T, typename... Tail> void chmin(T &t, const Tail &...tail) {
  t = var_min(t, tail...);
}
template <typename T, typename... Tail> void chmax(T &t, const Tail &...tail) {
  t = var_max(t, tail...);
}
void debug_func_preffix(const string &s) {
  if (s.size())
    cout << s << " = ";
}
template <typename T> void debug_func(const T &t, const string &s = "") {
  debug_func_preffix(s);
  cout << t << DEBUG_ENDL_S(s);
}
template <typename T, typename U>
void debug_func(const P<T, U> &p, const string &s = "") {
  debug_func_preffix(s);
  cout << "(";
  debug_func(p.first);
  cout << ", ";
  debug_func(p.second);
  cout << ")" << DEBUG_ENDL_S(s);
}
template <typename T> void debug_func(const V<T> &v, const string &s = "") {
  for (ll i = 0; i < v.size(); i++) {
    string t = s + "[" + to_string(i) + "]";
    debug_func(v[i], t);
  }
}

void init_io() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(30);
}

const ll MOD = 1e9 + 7;

int main() {
  init_io();
  ll N;
  cin >> N;
  V<ll> dp(N + 1);
  ll pre = -1;
  V<ll> prec(N, -1);
  dp[0] = 1;
  for (ll i = 0; i < N; i++) {
    ll e;
    cin >> e;
    e--;
    if (e == pre) {
      dp[i + 1] = dp[i];
      continue;
    }
    if (prec[e] == -1) {
      pre = e;
      prec[e] = i;
      dp[i + 1] = dp[i];
      continue;
    }
    DEBUG(i);
    DEBUG(e + 1);
    DEBUG(prec[e]);
    DEBUG(dp[prec[e]]);
    dp[i + 1] = (dp[prec[e] + 1] + dp[i]) % MOD;
    prec[e] = i;
    pre = e;
  }
  DEBUG(dp);
  cout << dp[N] << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
// #define DEBUG_MODE
#define endl '\n'
#ifdef DEBUG_MODE
#define DEBUG(X) debug_func(X, #X)
#define DEBUG_ENDL endl << flush
#define DEBUG_SEPARATOR_LINE cout << "=================\n"
#else
#define DEBUG(X) 0
#define DEBUG_ENDL 0
#define DEBUG_SEPARATOR_LINE 0
#endif
#define ALL(V) (V).begin(), (V).end()
#define ALLR(V) (V).rbegin(), (V).rend()
#define DEBUG_ENDL_S(S) ((S).size() ? "\n" : "") << flush;
template <typename T> using V = vector<T>;
template <typename T> using VV = V<V<T>>;
template <typename T, typename U> using P = pair<T, U>;
using ll = int64_t;
using PLL = P<ll, ll>;
template <typename T> const T &var_min(const T &t) { return t; }
template <typename T> const T &var_max(const T &t) { return t; }
template <typename Head, typename... Tail>
const Head &var_min(const Head &head, const Tail &...tail) {
  return min(head, var_min(tail...));
}
template <typename Head, typename... Tail>
const Head &var_max(const Head &head, const Tail &...tail) {
  return max(head, var_max(tail...));
}
template <typename T, typename... Tail> void chmin(T &t, const Tail &...tail) {
  t = var_min(t, tail...);
}
template <typename T, typename... Tail> void chmax(T &t, const Tail &...tail) {
  t = var_max(t, tail...);
}
void debug_func_preffix(const string &s) {
  if (s.size())
    cout << s << " = ";
}
template <typename T> void debug_func(const T &t, const string &s = "") {
  debug_func_preffix(s);
  cout << t << DEBUG_ENDL_S(s);
}
template <typename T, typename U>
void debug_func(const P<T, U> &p, const string &s = "") {
  debug_func_preffix(s);
  cout << "(";
  debug_func(p.first);
  cout << ", ";
  debug_func(p.second);
  cout << ")" << DEBUG_ENDL_S(s);
}
template <typename T> void debug_func(const V<T> &v, const string &s = "") {
  for (ll i = 0; i < v.size(); i++) {
    string t = s + "[" + to_string(i) + "]";
    debug_func(v[i], t);
  }
}

void init_io() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(30);
}

const ll MOD = 1e9 + 7;

int main() {
  init_io();
  ll N;
  cin >> N;
  V<ll> dp(N + 1);
  ll pre = -1;
  V<ll> prec(2e5 + 10, -1);
  dp[0] = 1;
  for (ll i = 0; i < N; i++) {
    ll e;
    cin >> e;
    e--;
    if (e == pre) {
      dp[i + 1] = dp[i];
      continue;
    }
    if (prec[e] == -1) {
      pre = e;
      prec[e] = i;
      dp[i + 1] = dp[i];
      continue;
    }
    DEBUG(i);
    DEBUG(e + 1);
    DEBUG(prec[e]);
    DEBUG(dp[prec[e]]);
    dp[i + 1] = (dp[prec[e] + 1] + dp[i]) % MOD;
    prec[e] = i;
    pre = e;
  }
  DEBUG(dp);
  cout << dp[N] << endl;
  return 0;
}