Problem p03096 (C++)

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

typedef long long ll;
typedef pair<ll, ll> P;

#define rep(i, n) for (ll(i) = 0; (i) < (ll)(n); (i)++)
#define frep(i, m, n) for (ll(i) = (m); (i) <= (ll)(n); (i)++)
#define rrep(i, n) for (ll(i) = (n)-1; (i) > -1; (i)--)
#define frrep(i, m, n) for (ll(i) = (n); (i) > (ll)(m); (i)--)
#define ALL(x) (x).begin(), (x).end()

const ll INF = 100100100100100100;
const ll MOD = 1000000007;

// get abs
ll my_abs(ll a);
// a^n
ll a_n(ll a, ll n);
// get gcd
ll my_gcd(ll a, ll b);
// a^(-1) % MOD
ll inv(ll a);
// (a+b+c)%MOD
ll madd(ll a, ll b, ll c);
// (a-b)%MOD
ll msub(ll a, ll b);
// (a*b*c)%MOD
ll mtime(ll a, ll b, ll c);

int main() {
  ll n;
  cin >> n;
  vector<ll> c;
  vector<vector<ll>> place(n + 1, vector<ll>());
  rep(i, n) {
    ll tmp;
    cin >> tmp;
    if (i > 0)
      if (c[c.size() - 1] == tmp)
        continue;
    c.push_back(tmp);
  }

  rep(i, c.size()) { place[c[i]].push_back(i); }

  vector<ll> dp(c.size() + 1, 0);
  dp[0] = 1;

  frep(i, 1, c.size()) {
    dp[i] = madd(dp[i], dp[i - 1], 0);
    ll color = c[i - 1];

    auto iter = lower_bound(ALL(place[color]), i - 1) - place[color].begin();
    if (iter > 0 && place[color][iter - 1] + 1 != i - 1) {
      dp[i] = madd(dp[i], dp[place[color][iter - 1] + 1], 0);
    }
  }

  cout << dp[c.size()] << endl;

  return 0;
}

ll my_abs(ll a) {
  if (a >= 0)
    return a;
  else
    return -1 * a;
}

ll a_n(ll a, ll n) {
  if (n == 0)
    return 1;

  ll ret = a, count = 1;
  while (count * 2 < n) {
    ret *= ret;
    count *= 2;
  }
  if (count == n)
    return ret;
  else
    return (ret * a_n(a, n - count));
}

ll my_gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return my_gcd(b, a % b);
}

ll inv(ll a) { return a_n(a, MOD - 2); }

ll madd(ll a, ll b, ll c) {
  ll ret = (a + b) % MOD;
  return (ret + c) % MOD;
}

ll msub(ll a, ll b) {
  if (a < b)
    return (a - b + MOD) % MOD;
  else
    return (a - b) % MOD;
}

ll mtime(ll a, ll b, ll c) {
  ll ret = (a * b) % MOD;
  return (ret * c) % MOD;
}


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

typedef long long ll;
typedef pair<ll, ll> P;

#define rep(i, n) for (ll(i) = 0; (i) < (ll)(n); (i)++)
#define frep(i, m, n) for (ll(i) = (m); (i) <= (ll)(n); (i)++)
#define rrep(i, n) for (ll(i) = (n)-1; (i) > -1; (i)--)
#define frrep(i, m, n) for (ll(i) = (n); (i) > (ll)(m); (i)--)
#define ALL(x) (x).begin(), (x).end()

const ll INF = 100100100100100100;
const ll MOD = 1000000007;

// get abs
ll my_abs(ll a);
// a^n
ll a_n(ll a, ll n);
// get gcd
ll my_gcd(ll a, ll b);
// a^(-1) % MOD
ll inv(ll a);
// (a+b+c)%MOD
ll madd(ll a, ll b, ll c);
// (a-b)%MOD
ll msub(ll a, ll b);
// (a*b*c)%MOD
ll mtime(ll a, ll b, ll c);

int main() {
  ll n;
  cin >> n;
  vector<ll> c;
  vector<vector<ll>> place(200005, vector<ll>());
  rep(i, n) {
    ll tmp;
    cin >> tmp;
    if (i > 0)
      if (c[c.size() - 1] == tmp)
        continue;
    c.push_back(tmp);
  }

  rep(i, c.size()) { place[c[i]].push_back(i); }

  vector<ll> dp(c.size() + 1, 0);
  dp[0] = 1;

  frep(i, 1, c.size()) {
    dp[i] = madd(dp[i], dp[i - 1], 0);
    ll color = c[i - 1];

    auto iter = lower_bound(ALL(place[color]), i - 1) - place[color].begin();
    if (iter > 0 && place[color][iter - 1] + 1 != i - 1) {
      dp[i] = madd(dp[i], dp[place[color][iter - 1] + 1], 0);
    }
  }

  cout << dp[c.size()] << endl;

  return 0;
}

ll my_abs(ll a) {
  if (a >= 0)
    return a;
  else
    return -1 * a;
}

ll a_n(ll a, ll n) {
  if (n == 0)
    return 1;

  ll ret = a, count = 1;
  while (count * 2 < n) {
    ret *= ret;
    count *= 2;
  }
  if (count == n)
    return ret;
  else
    return (ret * a_n(a, n - count));
}

ll my_gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return my_gcd(b, a % b);
}

ll inv(ll a) { return a_n(a, MOD - 2); }

ll madd(ll a, ll b, ll c) {
  ll ret = (a + b) % MOD;
  return (ret + c) % MOD;
}

ll msub(ll a, ll b) {
  if (a < b)
    return (a - b + MOD) % MOD;
  else
    return (a - b) % MOD;
}

ll mtime(ll a, ll b, ll c) {
  ll ret = (a * b) % MOD;
  return (ret * c) % MOD;
}