Problem p03096 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define FOR(i, m, n) for (int(i) = (m); (i) < (n); (i)++)
#define All(v) (v).begin(), (v).end()
#define pb push_back
#define MP(a, b) make_pair((a), (b))
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int INF = 1 << 30;
const ll LINF = 1LL << 60;
const int MOD = 1e9 + 7;

template <uint_fast64_t MOD> class ModInt {
  using u64 = uint_fast64_t;

public:
  u64 a;

  ModInt(const u64 x = 0) : a(x % MOD) {}
  constexpr u64 &value() { return a; }
  constexpr ModInt operator-() { return a ? MOD - a : 0; }
  constexpr ModInt operator+(const ModInt rhs) { return ModInt(*this) += rhs; }
  constexpr ModInt operator-(const ModInt rhs) { return ModInt(*this) -= rhs; }
  constexpr ModInt operator*(const ModInt rhs) { return ModInt(*this) *= rhs; }
  constexpr ModInt operator/(const ModInt rhs) { return ModInt(*this) /= rhs; }
  constexpr ModInt &operator+=(const ModInt rhs) {
    a += rhs.a;
    if (a >= MOD) {
      a -= MOD;
    }
    return *this;
  }
  constexpr ModInt &operator-=(const ModInt rhs) {
    if (a < rhs.a) {
      a += MOD;
    }
    a -= rhs.a;
    return *this;
  }
  constexpr ModInt &operator*=(const ModInt rhs) {
    a = a * rhs.a % MOD;
    return *this;
  }
  constexpr ModInt &operator/=(const ModInt rhs) {
    *this *= rhs.inv();
    return *this;
  }

  constexpr bool operator==(const ModInt rhs) { return this->a == rhs.a; }
  constexpr bool operator!=(const ModInt rhs) { return this->a != rhs.a; }
  friend constexpr ostream &operator<<(ostream &os, const ModInt<MOD> &x) {
    return os << x.a;
  }
  friend constexpr istream &operator>>(istream &is, ModInt<MOD> &x) {
    return is >> x.a;
  }

  constexpr ModInt inv() {
    u64 x = a, y = MOD, u = 1, v = 0, t = 0;
    while (y > 0) {
      t = x / y;
      a -= t * y;
      swap(x, y);
      u -= t * v;
      swap(u, v);
    }
    return ModInt(u);
  }

  constexpr ModInt pow(int e) {
    u64 x = 1, p = a;
    while (e > 0) {
      if (e % 2 == 0) {
        p = (p * p) % MOD;
        e /= 2;
      } else {
        x = (x * p) % MOD;
        e--;
      }
    }
    return ModInt(x);
  }
};

int main() {
  using mint = ModInt<MOD>;
  int N;
  cin >> N;
  vector<int> C(N);
  rep(i, N) cin >> C[i];
  vector<int> last(N + 1, -1);
  vector<mint> dp(N + 1);
  dp[0] = 1;
  // dp[i]:=i個めまで使った時の通り数
  for (int i = 0; i < N; i++) {
    if (last[C[i]] != -1) {
      if (last[C[i]] != i - 1)
        dp[i + 1] = dp[i] + dp[last[C[i]] + 1];
      else
        dp[i + 1] = dp[i];
    } else {
      dp[i + 1] = dp[i];
    }
    last[C[i]] = i;
  }
  cout << dp[N] << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define FOR(i, m, n) for (int(i) = (m); (i) < (n); (i)++)
#define All(v) (v).begin(), (v).end()
#define pb push_back
#define MP(a, b) make_pair((a), (b))
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int INF = 1 << 30;
const ll LINF = 1LL << 60;
const int MOD = 1e9 + 7;

template <uint_fast64_t MOD> class ModInt {
  using u64 = uint_fast64_t;

public:
  u64 a;

  ModInt(const u64 x = 0) : a(x % MOD) {}
  constexpr u64 &value() { return a; }
  constexpr ModInt operator-() { return a ? MOD - a : 0; }
  constexpr ModInt operator+(const ModInt rhs) { return ModInt(*this) += rhs; }
  constexpr ModInt operator-(const ModInt rhs) { return ModInt(*this) -= rhs; }
  constexpr ModInt operator*(const ModInt rhs) { return ModInt(*this) *= rhs; }
  constexpr ModInt operator/(const ModInt rhs) { return ModInt(*this) /= rhs; }
  constexpr ModInt &operator+=(const ModInt rhs) {
    a += rhs.a;
    if (a >= MOD) {
      a -= MOD;
    }
    return *this;
  }
  constexpr ModInt &operator-=(const ModInt rhs) {
    if (a < rhs.a) {
      a += MOD;
    }
    a -= rhs.a;
    return *this;
  }
  constexpr ModInt &operator*=(const ModInt rhs) {
    a = a * rhs.a % MOD;
    return *this;
  }
  constexpr ModInt &operator/=(const ModInt rhs) {
    *this *= rhs.inv();
    return *this;
  }

  constexpr bool operator==(const ModInt rhs) { return this->a == rhs.a; }
  constexpr bool operator!=(const ModInt rhs) { return this->a != rhs.a; }
  friend constexpr ostream &operator<<(ostream &os, const ModInt<MOD> &x) {
    return os << x.a;
  }
  friend constexpr istream &operator>>(istream &is, ModInt<MOD> &x) {
    return is >> x.a;
  }

  constexpr ModInt inv() {
    u64 x = a, y = MOD, u = 1, v = 0, t = 0;
    while (y > 0) {
      t = x / y;
      a -= t * y;
      swap(x, y);
      u -= t * v;
      swap(u, v);
    }
    return ModInt(u);
  }

  constexpr ModInt pow(int e) {
    u64 x = 1, p = a;
    while (e > 0) {
      if (e % 2 == 0) {
        p = (p * p) % MOD;
        e /= 2;
      } else {
        x = (x * p) % MOD;
        e--;
      }
    }
    return ModInt(x);
  }
};

int main() {
  using mint = ModInt<MOD>;
  int N;
  cin >> N;
  vector<int> C(N);
  rep(i, N) cin >> C[i];
  vector<int> last(200010, -1);
  vector<mint> dp(N + 1);
  dp[0] = 1;
  // dp[i]:=i個めまで使った時の通り数
  for (int i = 0; i < N; i++) {
    if (last[C[i]] != -1) {
      if (last[C[i]] != i - 1)
        dp[i + 1] = dp[i] + dp[last[C[i]] + 1];
      else
        dp[i + 1] = dp[i];
    } else {
      dp[i + 1] = dp[i];
    }
    last[C[i]] = i;
  }
  cout << dp[N] << endl;
  return 0;
}