Problem p03096 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define FOR(v, a, b) for (int v = (a); v < (b); ++v)
#define FORE(v, a, b) for (int v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for (int v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define ITR(it, c) for (auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for (auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c, x) ((c).find(x) != (c).end())
#define LLI long long int
#define fst first
#define snd second

#ifdef DEBUG
#include <misc/C++/Debug.cpp>
#else
#define dump(x)
#endif

#define gcd __gcd

using namespace std;
template <class T> constexpr T lcm(T m, T n) { return m / gcd(m, n) * n; }

template <typename I> void join(ostream &ost, I s, I t, string d = " ") {
  for (auto i = s; i != t; ++i) {
    if (i != s)
      ost << d;
    ost << *i;
  }
  ost << endl;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &a : v)
    is >> a;
  return is;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}

template <typename T, typename U> T &chmin(T &a, const U &b) {
  return a = (a <= b ? a : b);
}
template <typename T, typename U> T &chmax(T &a, const U &b) {
  return a = (a >= b ? a : b);
}
template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  fill((U *)a, (U *)(a + N), v);
}

const LLI mod = 1e9 + 7;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  while (cin >> N) {
    vector<int> c(N);
    cin >> c;
    for (auto &x : c)
      --x;

    vector<LLI> dp(N + 1);

    vector<int> prev(N, -1);
    vector<vector<int>> chain(N);

    REP(i, N) {
      if (!chain[c[i]].empty())
        prev[i] = chain[c[i]].back();
      chain[c[i]].push_back(i);
    }
    /*
    dump(chain);
    dump(prev);
    */
    dp[0] = 1;

    REP(i, N) {
      dp[i + 1] = dp[i];
      if (prev[i] >= 0 and prev[i] < i - 1)
        (dp[i + 1] += dp[prev[i] + 1]) %= mod;
    }

    cout << dp[N] << endl;
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define FOR(v, a, b) for (int v = (a); v < (b); ++v)
#define FORE(v, a, b) for (int v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for (int v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define ITR(it, c) for (auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for (auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c, x) ((c).find(x) != (c).end())
#define LLI long long int
#define fst first
#define snd second

#ifdef DEBUG
#include <misc/C++/Debug.cpp>
#else
#define dump(x)
#endif

#define gcd __gcd

using namespace std;
template <class T> constexpr T lcm(T m, T n) { return m / gcd(m, n) * n; }

template <typename I> void join(ostream &ost, I s, I t, string d = " ") {
  for (auto i = s; i != t; ++i) {
    if (i != s)
      ost << d;
    ost << *i;
  }
  ost << endl;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &a : v)
    is >> a;
  return is;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}

template <typename T, typename U> T &chmin(T &a, const U &b) {
  return a = (a <= b ? a : b);
}
template <typename T, typename U> T &chmax(T &a, const U &b) {
  return a = (a >= b ? a : b);
}
template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  fill((U *)a, (U *)(a + N), v);
}

const LLI mod = 1e9 + 7;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N;
  while (cin >> N) {
    vector<int> c(N);
    cin >> c;
    for (auto &x : c)
      --x;

    vector<LLI> dp(N + 1);

    vector<int> prev(N, -1);
    vector<vector<int>> chain(200000);

    REP(i, N) {
      if (!chain[c[i]].empty())
        prev[i] = chain[c[i]].back();
      chain[c[i]].push_back(i);
    }
    /*
    dump(chain);
    dump(prev);
    */
    dp[0] = 1;

    REP(i, N) {
      dp[i + 1] = dp[i];
      if (prev[i] >= 0 and prev[i] < i - 1)
        (dp[i + 1] += dp[prev[i] + 1]) %= mod;
    }

    cout << dp[N] << endl;
  }

  return 0;
}