Problem p02782 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll;

#define sz size()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rep(i, a, b) for (ll i = (a); i < (b); ++i)
#define per(i, a, b) for (ll i = b - 1LL; i >= (a); --i)
#define clr(a, b) memset((a), (b), sizeof(a))
#define ctos(c) string(1, c)
#define print(x) cout << #x << " = " << x << endl;

#define MOD 1000000007LL

#define N_MAX 1000100

long long fact[N_MAX];
long long rfact[N_MAX];

long long modpow(long long a, long long b) {
  long long r = 1LL;

  while (b) {
    if (b & 1LL)
      r *= a;
    if (r >= MOD)
      r %= MOD;
    a *= a;
    if (a >= MOD)
      a %= MOD;
    b >>= 1LL;
  }
  return r % MOD;
}

long long nCr(long long n, long long r) {
  long long ret = 1LL;
  ret *= fact[n];
  ret %= MOD;
  ret *= rfact[r];
  ret %= MOD;
  ret *= rfact[n - r];
  ret %= MOD;
  return ret;
}

ll f(ll r, ll c) {
  ll ret = r + 1;
  rep(i, 1, c + 1) {
    ret += nCr(r + i + 1, r) % MOD;
    ret %= MOD;
  }
  return ret;
}

int main() {
  clr(fact, 0);
  fact[0] = 1;
  rep(i, 1, N_MAX) {
    fact[i] = fact[i - 1] * i;
    fact[i] %= MOD;
  }
  clr(rfact, 0);
  rfact[0] = 1;
  rep(i, 1, N_MAX) {
    rfact[i] = rfact[i - 1] * modpow(i, MOD - 2);
    rfact[i] %= MOD;
  }
  ll r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  ll a1 = f(r2, c2) % MOD;
  ll a2 = f(r1 - 1, c2) % MOD;
  ll a3 = f(r2, c1 - 1) % MOD;
  ll a4 = f(r1 - 1, c1 - 1) % MOD;
  ll ans = MOD * 4 + a1 - a2 - a3 + a4;
  cout << ans % MOD << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll;

#define sz size()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rep(i, a, b) for (ll i = (a); i < (b); ++i)
#define per(i, a, b) for (ll i = b - 1LL; i >= (a); --i)
#define clr(a, b) memset((a), (b), sizeof(a))
#define ctos(c) string(1, c)
#define print(x) cout << #x << " = " << x << endl;

#define MOD 1000000007LL

#define N_MAX 2000100

long long fact[N_MAX];
long long rfact[N_MAX];

long long modpow(long long a, long long b) {
  long long r = 1LL;

  while (b) {
    if (b & 1LL)
      r *= a;
    if (r >= MOD)
      r %= MOD;
    a *= a;
    if (a >= MOD)
      a %= MOD;
    b >>= 1LL;
  }
  return r % MOD;
}

long long nCr(long long n, long long r) {
  long long ret = 1LL;
  ret *= fact[n];
  ret %= MOD;
  ret *= rfact[r];
  ret %= MOD;
  ret *= rfact[n - r];
  ret %= MOD;
  return ret;
}

ll f(ll r, ll c) {
  ll ret = r + 1;
  rep(i, 1, c + 1) {
    ret += nCr(r + i + 1, r) % MOD;
    ret %= MOD;
  }
  return ret;
}

int main() {
  clr(fact, 0);
  fact[0] = 1;
  rep(i, 1, N_MAX) {
    fact[i] = fact[i - 1] * i;
    fact[i] %= MOD;
  }
  clr(rfact, 0);
  rfact[0] = 1;
  rep(i, 1, N_MAX) {
    rfact[i] = rfact[i - 1] * modpow(i, MOD - 2);
    rfact[i] %= MOD;
  }
  ll r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  ll a1 = f(r2, c2) % MOD;
  ll a2 = f(r1 - 1, c2) % MOD;
  ll a3 = f(r2, c1 - 1) % MOD;
  ll a4 = f(r1 - 1, c1 - 1) % MOD;
  ll ans = MOD * 4 + a1 - a2 - a3 + a4;
  cout << ans % MOD << endl;
  return 0;
}