Problem p03013 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
using namespace std;

typedef pair<int, int> P;
typedef long long ll;
const int mod = 1000000007;

bool square(ll a) {
  ll n = (ll)sqrt(a);
  return a == n * n;
}
int digitsum(ll N, int a); // a進数におけるNの各桁の和、計算量はloga(N)
ll mpow(ll x, ll n);
ll inv_mod(ll a) { return mpow(a, mod - 2); }
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }; // xとyの最大公約数
int lcm(int x, int y) { return x * y / gcd(x, y); } // xとyの最小公倍数

int main() {
  int N, M;
  cin >> N >> M;
  vector<int> a(M);
  REP(i, M) cin >> a[i];
  vector<int> dp(N + 1);
  dp[0] = 1;
  if (a[0] == 1) {
    dp[1] = 0;
    a.erase(a.begin());
  } else
    dp[1] = 1;
  for (int i = 0; i < N - 1; i++) {
    if (a.empty())
      a.push_back(INT_MAX);
    if (i + 2 == a[0]) {
      dp[i + 2] = 0;
      a.erase(a.begin());
    } else
      dp[i + 2] = (dp[i + 1] + dp[i]) % mod;
  }
  cout << dp[N] << endl;
}

int digitsum(ll N, int a) {
  if (N == 0)
    return 0;
  int ret = 0;
  ret += digitsum(N / a, a) + N % a;
  return ret;
}
ll mpow(ll x, ll n) { // x^n(mod division)
                      // ←普通にpow(x,n)では溢れてしまうため，随時mod計算
                      // 2分累乗法だから早い
  ll ans = 1;
  while (n != 0) {
    if (n & 1)
      ans = ans * x % mod;
    x = x * x % mod;
    n = n >> 1;
  }
  return ans;
}
/*
class Fuctorical{//階乗とその逆元を求めて計算に利用するクラス
private:
    vector<ll> fac;
public:

    Fuctorical(ll N){
        fac.push_back(1);
        for(int i=0;i<N;i++) fac.push_back(fac[i]*(i+1)%mod);
    }

    ll fact(ll a){return fac[a];}
    ll ifact(ll a){return inv_mod(fac[a]);}

    ll cmb(ll a,ll b){
        if(a==0&&b==0) return 1;
        if(a<b||a<0) return 0;
        ll tmp =ifact(a-b)*ifact(b)%mod;
        return tmp*fac[a]%mod;
    }
};
*/

/*
class UnionFind{//UnionFind木
 private:
    vector<int> Parent;
 public:
    UnionFind(int N){
        for(int i=0;i<N;i++) Parent.push_back(-1);
    }

    int root(int A){
        if(Parent[A]<0) return A;
        return Parent[A]=root(Parent[A]);
    }

    int size(int A){
        return -Parent[root(A)];
    }

    bool connect(int A,int B){
        A=root(A);
        B=root(B);
        if(A==B) return false;
        if(size(A)<size(B)) swap(A,B);
        Parent[A]-=Parent[B];
        Parent[B]=A;
    }
};
*/

Fixed submission:
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
using namespace std;

typedef pair<int, int> P;
typedef long long ll;
const int mod = 1000000007;

bool square(ll a) {
  ll n = (ll)sqrt(a);
  return a == n * n;
}
int digitsum(ll N, int a); // a進数におけるNの各桁の和、計算量はloga(N)
ll mpow(ll x, ll n);
ll inv_mod(ll a) { return mpow(a, mod - 2); }
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }; // xとyの最大公約数
int lcm(int x, int y) { return x * y / gcd(x, y); } // xとyの最小公倍数

int main() {
  int N, M;
  cin >> N >> M;
  vector<int> a(M);
  if (M > 0)
    REP(i, M) cin >> a[i];
  else
    a.push_back(INT_MAX);
  vector<int> dp(N + 1);
  dp[0] = 1;
  if (a[0] == 1) {
    dp[1] = 0;
    a.erase(a.begin());
  } else
    dp[1] = 1;
  for (int i = 0; i < N - 1; i++) {
    if (a.empty())
      a.push_back(INT_MAX);
    if (i + 2 == a[0]) {
      dp[i + 2] = 0;
      a.erase(a.begin());
    } else
      dp[i + 2] = (dp[i + 1] + dp[i]) % mod;
  }
  cout << dp[N] << endl;
}

int digitsum(ll N, int a) {
  if (N == 0)
    return 0;
  int ret = 0;
  ret += digitsum(N / a, a) + N % a;
  return ret;
}
ll mpow(ll x, ll n) { // x^n(mod division)
                      // ←普通にpow(x,n)では溢れてしまうため，随時mod計算
                      // 2分累乗法だから早い
  ll ans = 1;
  while (n != 0) {
    if (n & 1)
      ans = ans * x % mod;
    x = x * x % mod;
    n = n >> 1;
  }
  return ans;
}
/*
class Fuctorical{//階乗とその逆元を求めて計算に利用するクラス
private:
    vector<ll> fac;
public:

    Fuctorical(ll N){
        fac.push_back(1);
        for(int i=0;i<N;i++) fac.push_back(fac[i]*(i+1)%mod);
    }

    ll fact(ll a){return fac[a];}
    ll ifact(ll a){return inv_mod(fac[a]);}

    ll cmb(ll a,ll b){
        if(a==0&&b==0) return 1;
        if(a<b||a<0) return 0;
        ll tmp =ifact(a-b)*ifact(b)%mod;
        return tmp*fac[a]%mod;
    }
};
*/

/*
class UnionFind{//UnionFind木
 private:
    vector<int> Parent;
 public:
    UnionFind(int N){
        for(int i=0;i<N;i++) Parent.push_back(-1);
    }

    int root(int A){
        if(Parent[A]<0) return A;
        return Parent[A]=root(Parent[A]);
    }

    int size(int A){
        return -Parent[root(A)];
    }

    bool connect(int A,int B){
        A=root(A);
        B=root(B);
        if(A==B) return false;
        if(size(A)<size(B)) swap(A,B);
        Parent[A]-=Parent[B];
        Parent[B]=A;
    }
};
*/