Problem p03172 (C++)

Buggy submission (status: Runtime Error):
#pragma GCC optimize("-O3")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;
using namespace std;

#define all(c) (c).begin(), (c).end()
#define endl "\n"
#define ff first
#define ss second
#define allr(c) (c).rbegin(), (c).rend()
#define ifr(i, begin, end)                                                     \
  for (__typeof(end) i = (begin) - ((begin) > (end));                          \
       i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define pof pop_front
#define pob pop_back
#define pb emplace_back
#define pf emplace_front
#define fstm(m, n, r)                                                          \
  m.reserve(n);                                                                \
  m.max_load_factor(r)
#define mp make_pair
#define mt make_tuple
#define inf LLONG_MAX
#define os                                                                     \
  tree<int, null_type, less<int>, rb_tree_tag,                                 \
       tree_order_statistics_node_update>
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
const double PI = acos(-1);
typedef complex<double> cd;
typedef long long ll;
ll gcd() { return 0ll; }
template <typename T, typename... Args> T gcd(T a, Args... args) {
  return __gcd(a, (__typeof(a))gcd(args...));
}
typedef map<ll, ll> mll;
typedef map<string, ll> msll;
typedef unordered_map<ll, ll> umap;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef long double ld;
#define mod 1000000007
#define N 100002

ll dp[101][N], pre[N];

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
#endif
  int n, k;
  cin >> n >> k;
  ll a[n];
  ifr(i, 0, n) cin >> a[i];
  ifr(i, 0, n) ifr(j, 0, N) dp[i][j] = 0;
  ifr(i, 0, a[0] + 1) dp[0][i] = 1;
  ifr(i, 1, n) {
    ifr(j, 0, k + 1) {
      pre[j] = dp[i - 1][j] + ((j - 1 >= 0) ? pre[j - 1] : 0);
      pre[j] %= mod;
      dp[i][j] = (pre[j] - ((j - a[i] - 1 >= 0) ? pre[j - a[i] - 1] : 0)) % mod;
      dp[i][j] = (dp[i][j] + mod) % mod;
    }
  }
  cout << dp[n - 1][k] << endl;
  return 0;
}

Fixed submission:
#pragma GCC optimize("-O3")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;
using namespace std;

#define all(c) (c).begin(), (c).end()
#define endl "\n"
#define ff first
#define ss second
#define allr(c) (c).rbegin(), (c).rend()
#define ifr(i, begin, end)                                                     \
  for (__typeof(end) i = (begin) - ((begin) > (end));                          \
       i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define pof pop_front
#define pob pop_back
#define pb emplace_back
#define pf emplace_front
#define fstm(m, n, r)                                                          \
  m.reserve(n);                                                                \
  m.max_load_factor(r)
#define mp make_pair
#define mt make_tuple
#define inf LLONG_MAX
#define os                                                                     \
  tree<int, null_type, less<int>, rb_tree_tag,                                 \
       tree_order_statistics_node_update>
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
const double PI = acos(-1);
typedef complex<double> cd;
typedef long long ll;
ll gcd() { return 0ll; }
template <typename T, typename... Args> T gcd(T a, Args... args) {
  return __gcd(a, (__typeof(a))gcd(args...));
}
typedef map<ll, ll> mll;
typedef map<string, ll> msll;
typedef unordered_map<ll, ll> umap;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef long double ld;
#define mod 1000000007
#define N 100002

ll dp[101][N], pre[N];

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int n, k;
  cin >> n >> k;
  ll a[n];
  ifr(i, 0, n) cin >> a[i];
  ifr(i, 0, n) ifr(j, 0, N) dp[i][j] = 0;
  ifr(i, 0, a[0] + 1) dp[0][i] = 1;
  ifr(i, 1, n) {
    ifr(j, 0, k + 1) {
      pre[j] = dp[i - 1][j] + ((j - 1 >= 0) ? pre[j - 1] : 0);
      pre[j] %= mod;
      dp[i][j] = (pre[j] - ((j - a[i] - 1 >= 0) ? pre[j - a[i] - 1] : 0)) % mod;
      dp[i][j] = (dp[i][j] + mod) % mod;
    }
  }
  cout << dp[n - 1][k] << endl;
  return 0;
}