Problem p03172 (C++)

Buggy submission (status: Runtime Error):
/**
 🍪 the_hyp0cr1t3
 🍪 31.08.2020 16:36:44
**/
#ifdef W
#include "k_II.h"
#else
#include <bits/stdc++.h>
using namespace std;
#define aylmao cin.tie(nullptr)->sync_with_stdio(false);
#endif
#define endl '\n'
#define pb emplace_back
// #define int int64_t
#define sz(x) (int)((x).size())
#define all(x) x.begin(), x.end()
#define Luv(...) [&](auto &&u, auto &&v) { return __VA_ARGS__; }
auto chmax = [](auto &A, auto &&B) { return B > A ? A = B, true : false; };
auto chmin = [](auto &A, auto &&B) { return B < A ? A = B, true : false; };

using ll = int64_t;
using pii = pair<int, int>;
const ll DESPACITO = 2e18;
const int INF = 2e9, MOD = 1e9 + 7;

struct num {
  typedef decay<decltype(MOD)>::type T;
  T v;
  static T inv(T a, T m) {
    a %= m;
    return a == 1 ? 1 : (T)(m - ll(inv(m, a)) * ll(m) / a);
  }
  num() : v(0) {}
  num(ll v_) {
    v = (-MOD < v_ && v_ < MOD) ? T(v_) : T(v_ % MOD);
    if (v < 0)
      v += MOD;
  }
  explicit operator T() const { return v; }
  friend std::ostream &operator<<(std::ostream &out, const num &n) {
    return out << T(n);
  }
  friend std::istream &operator>>(std::istream &in, num &n) {
    ll v_;
    in >> v_;
    n = num(v_);
    return in;
  }
  friend bool operator==(const num &a, const num &b) { return a.v == b.v; }
  friend bool operator!=(const num &a, const num &b) { return a.v != b.v; }
  num inv() const {
    num res;
    res.v = inv(v, MOD);
    return res;
  }
  num operator-() const {
    num res;
    res.v = v ? MOD - v : 0;
    return res;
  }
  num operator+() const { return num(*this); }
  num &operator++() {
    v++;
    if (v == MOD)
      v = 0;
    return *this;
  }
  num &operator--() {
    if (v == 0)
      v = MOD;
    v--;
    return *this;
  }
  num &operator+=(const num &o) {
    v += o.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  num &operator-=(const num &o) {
    v -= o.v;
    if (v < 0)
      v += MOD;
    return *this;
  }
  num &operator*=(const num &o) {
    v = T(ll(v) * ll(o.v) % MOD);
    return *this;
  }
  num &operator/=(const num &o) { return *this *= o.inv(); }
  friend num operator++(num &a, int) {
    num r = a;
    ++a;
    return r;
  }
  friend num operator--(num &a, int) {
    num r = a;
    --a;
    return r;
  }
  friend num operator+(const num &a, const num &b) { return num(a) += b; }
  friend num operator-(const num &a, const num &b) { return num(a) -= b; }
  friend num operator*(const num &a, const num &b) { return num(a) *= b; }
  friend num operator/(const num &a, const num &b) { return num(a) /= b; }
  friend bool operator<(const num &a, const num &b) { return a.v < b.v; }
  friend bool operator<=(const num &a, const num &b) { return a.v <= b.v; }
  friend bool operator>(const num &a, const num &b) { return a.v > b.v; }
  friend bool operator>=(const num &a, const num &b) { return a.v >= b.v; }
};

const int N = 1e5 + 5;
num dp[100][N];

int32_t main() {
  aylmao int i, j, n, k;
  cin >> n >> k;
  dp[0][k] = 1;
  for (i = 1; i <= n; i++) {
    int a;
    cin >> a;
    for (j = 0; j <= k; j++) {
      dp[i][max(j - a, 0)] += dp[i - 1][j];
      dp[i][j + 1] -= dp[i - 1][j];
    }
    for (j = 0; j <= k; j++)
      dp[i][j] += dp[i][j - 1];
  }
  cout << dp[n][0];
  return 0;
}

Fixed submission:
/**
 🍪 the_hyp0cr1t3
 🍪 31.08.2020 16:36:44
**/
#ifdef W
#include "k_II.h"
#else
#include <bits/stdc++.h>
using namespace std;
#define aylmao cin.tie(nullptr)->sync_with_stdio(false);
#endif
#define endl '\n'
#define pb emplace_back
// #define int int64_t
#define sz(x) (int)((x).size())
#define all(x) x.begin(), x.end()
#define Luv(...) [&](auto &&u, auto &&v) { return __VA_ARGS__; }
auto chmax = [](auto &A, auto &&B) { return B > A ? A = B, true : false; };
auto chmin = [](auto &A, auto &&B) { return B < A ? A = B, true : false; };

using ll = int64_t;
using pii = pair<int, int>;
const ll DESPACITO = 2e18;
const int INF = 2e9, MOD = 1e9 + 7;

struct num {
  typedef decay<decltype(MOD)>::type T;
  T v;
  static T inv(T a, T m) {
    a %= m;
    return a == 1 ? 1 : (T)(m - ll(inv(m, a)) * ll(m) / a);
  }
  num() : v(0) {}
  num(ll v_) {
    v = (-MOD < v_ && v_ < MOD) ? T(v_) : T(v_ % MOD);
    if (v < 0)
      v += MOD;
  }
  explicit operator T() const { return v; }
  friend std::ostream &operator<<(std::ostream &out, const num &n) {
    return out << T(n);
  }
  friend std::istream &operator>>(std::istream &in, num &n) {
    ll v_;
    in >> v_;
    n = num(v_);
    return in;
  }
  friend bool operator==(const num &a, const num &b) { return a.v == b.v; }
  friend bool operator!=(const num &a, const num &b) { return a.v != b.v; }
  num inv() const {
    num res;
    res.v = inv(v, MOD);
    return res;
  }
  num operator-() const {
    num res;
    res.v = v ? MOD - v : 0;
    return res;
  }
  num operator+() const { return num(*this); }
  num &operator++() {
    v++;
    if (v == MOD)
      v = 0;
    return *this;
  }
  num &operator--() {
    if (v == 0)
      v = MOD;
    v--;
    return *this;
  }
  num &operator+=(const num &o) {
    v += o.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  num &operator-=(const num &o) {
    v -= o.v;
    if (v < 0)
      v += MOD;
    return *this;
  }
  num &operator*=(const num &o) {
    v = T(ll(v) * ll(o.v) % MOD);
    return *this;
  }
  num &operator/=(const num &o) { return *this *= o.inv(); }
  friend num operator++(num &a, int) {
    num r = a;
    ++a;
    return r;
  }
  friend num operator--(num &a, int) {
    num r = a;
    --a;
    return r;
  }
  friend num operator+(const num &a, const num &b) { return num(a) += b; }
  friend num operator-(const num &a, const num &b) { return num(a) -= b; }
  friend num operator*(const num &a, const num &b) { return num(a) *= b; }
  friend num operator/(const num &a, const num &b) { return num(a) /= b; }
  friend bool operator<(const num &a, const num &b) { return a.v < b.v; }
  friend bool operator<=(const num &a, const num &b) { return a.v <= b.v; }
  friend bool operator>(const num &a, const num &b) { return a.v > b.v; }
  friend bool operator>=(const num &a, const num &b) { return a.v >= b.v; }
};

const int N = 1e5 + 5;
num dp[101][N];

int32_t main() {
  aylmao int i, j, n, k;
  cin >> n >> k;
  dp[0][k] = 1;
  for (i = 1; i <= n; i++) {
    int a;
    cin >> a;
    for (j = 0; j <= k; j++) {
      dp[i][max(j - a, 0)] += dp[i - 1][j];
      dp[i][j + 1] -= dp[i - 1][j];
    }
    for (j = 0; j <= k; j++)
      dp[i][j] += dp[i][j - 1];
  }
  cout << dp[n][0];
  return 0;
}