Problem p03013 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define push emplace_back
#define each(i, x) for (auto i = 0; i < x; i++)
using ull = unsigned long long;
constexpr auto mod = 1000000007;
constexpr auto INF = ULLONG_MAX;

using namespace std;
template <typename T> inline void dump(const T &x) {
  cout << "[" << x << "]" << endl;
}
template <typename T> inline void dump(const vector<T> &x) {
  for (const auto v : x) {
    cout << v << " ";
  }
  cout << endl;
}
template <typename T> inline void sort_asc(vector<T> &x) {
  std::sort(x.begin(), x.end());
}
template <typename T> inline void sort_desc(vector<T> &x) {
  std::sort(x.begin(), x.end(), greater<T>());
}
template <typename T> inline T max_value(vector<T> &x) {
  return *max_element(x.begin(), x.end());
}
template <typename T> inline T min_value(vector<T> &x) {
  return *min_element(x.begin(), x.end());
}
template <typename T> inline T sum_value(vector<T> &x) {
  return accumulate(x.begin(), x.end(), 0ULL);
}

int main() {
  // std::cout << std::fixed << std::setprecision(10);
  ull n, m;
  cin >> n >> m;

  vector<ull> a;
  each(i, m) {
    ull tmp;
    cin >> tmp;
    a.push(tmp);
  }

  vector<ull> dp(n + 1, 0); // N個と、何も選んでない状態の +1
  // f(n) = f(n-1) + f(n-2)

  // d[i] i段目に行到達する方法は何通りあるか？

  ull index = 0;
  for (ull i = 1; i <= n; i++) {

    if (i == a[index]) {
      dp[i] = 0;
      index++;
    } else {

      if (i == 1) {
        dp[1] = 1; // 1段目は 1 の1通り
      } else if (i == 2) {
        if (dp[1] == 0) {
          dp[2] = 1; // 1段目が壊れてる場合は2段目は 2 の1通り
        } else {
          dp[2] = 2; // 2段目は 1+1 と 2 の2通り
        }
      } else {
        dp[i] = (dp[i - 1] % mod) + (dp[i - 2] % mod);
      }
    }
  }

  cout << dp[n] % mod << endl;

  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define push emplace_back
#define each(i, x) for (auto i = 0; i < x; i++)
using ull = unsigned long long;
constexpr auto mod = 1000000007;
constexpr auto INF = ULLONG_MAX;

using namespace std;
template <typename T> inline void dump(const T &x) {
  cout << "[" << x << "]" << endl;
}
template <typename T> inline void dump(const vector<T> &x) {
  for (const auto v : x) {
    cout << v << " ";
  }
  cout << endl;
}
template <typename T> inline void sort_asc(vector<T> &x) {
  std::sort(x.begin(), x.end());
}
template <typename T> inline void sort_desc(vector<T> &x) {
  std::sort(x.begin(), x.end(), greater<T>());
}
template <typename T> inline T max_value(vector<T> &x) {
  return *max_element(x.begin(), x.end());
}
template <typename T> inline T min_value(vector<T> &x) {
  return *min_element(x.begin(), x.end());
}
template <typename T> inline T sum_value(vector<T> &x) {
  return accumulate(x.begin(), x.end(), 0ULL);
}

int main() {
  // std::cout << std::fixed << std::setprecision(10);
  ull n, m;
  cin >> n >> m;

  vector<ull> a;
  each(i, m) {
    ull tmp;
    cin >> tmp;
    a.push(tmp);
  }

  vector<ull> dp(n + 1, 0); // N個と、何も選んでない状態の +1
  // f(n) = f(n-1) + f(n-2)

  // d[i] i段目に行到達する方法は何通りあるか？

  ull index = 0;
  for (ull i = 1; i <= n; i++) {

    if ((index < a.size()) && (i == a[index])) {
      dp[i] = 0;
      index++;
    } else {

      if (i == 1) {
        dp[1] = 1; // 1段目は 1 の1通り
      } else if (i == 2) {
        if (dp[1] == 0) {
          dp[2] = 1; // 1段目が壊れてる場合は2段目は 2 の1通り
        } else {
          dp[2] = 2; // 2段目は 1+1 と 2 の2通り
        }
      } else {
        dp[i] = (dp[i - 1] % mod) + (dp[i - 2] % mod);
      }
    }
  }

  cout << dp[n] % mod << endl;

  return 0;
}