Problem p02782 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define ll int64_t
#define Rep(i, n) for (ll i = 0; i < n; i++)
using namespace std;
typedef vector<ll> vec;
typedef vector<vec> mat;

const ll inf = 1LL << 60;

template <class T> inline void chmin(T &a, T b) {
  if (a > b) {
    a = b;
  }
}
template <class T> inline void chmax(T &a, T b) {
  if (a < b) {
    a = b;
  }
}

const int MOD = 1e9 + 7;
class mint {
  ll x;

public:
  mint(ll x = 0) : x((x % MOD + MOD) % MOD) {}

  mint operator-() const { return mint(-x); }

  mint &operator+=(const mint &a) {
    if ((x += a.x) >= MOD)
      x -= MOD;
    return *this;
  }

  mint &operator-=(const mint &a) {
    if ((x += MOD - a.x) >= MOD)
      x -= MOD;
    return *this;
  }

  mint &operator*=(const mint &a) {
    (x *= a.x) %= MOD;
    return *this;
  }

  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }

  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }

  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }

  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(MOD - 2); }

  mint &operator/=(const mint &a) { return (*this) *= a.inv(); }

  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }

  friend ostream &operator<<(ostream &os, const mint &m) {
    os << m.x;
    return os;
  }
};

const int MAX = 200010;
mint fac[MAX], finv[MAX];

void COMinit() {
  fac[0] = fac[1] = 1;
  finv[0] = finv[1] = 1;
  for (int i = 2; i < MAX; i++) {
    fac[i] = fac[i - 1] * mint(i);
    finv[i] = finv[i - 1] * mint(i).inv();
  }
}

mint COM(int n, int k) {
  if (n < k)
    return mint(0);
  if (n < 0 || k < 0)
    return mint(0);
  // o(k)
  // if (k < MAX) {
  //     mint ret(1);
  //     Rep (i, k) {
  //         ret *= mint(n-i);
  //         ret /= mint(k-i);
  //     }
  //     return ret;
  // }

  return fac[n] * finv[k] * finv[n - k];
}

mint s(ll r, ll c) {
  mint a(0);
  Rep(i, r + 1) a += COM(i + 1 + c, c);
  return a;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  ll r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  r1--;
  c1--;

  COMinit();

  // cout << s(r2, c2) << "\n";

  cout << s(r2, c2) - s(r1, c2) - s(r2, c1) + s(r1, c1) << endl;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define ll int64_t
#define Rep(i, n) for (ll i = 0; i < n; i++)
using namespace std;
typedef vector<ll> vec;
typedef vector<vec> mat;

const ll inf = 1LL << 60;

template <class T> inline void chmin(T &a, T b) {
  if (a > b) {
    a = b;
  }
}
template <class T> inline void chmax(T &a, T b) {
  if (a < b) {
    a = b;
  }
}

const int MOD = 1e9 + 7;
class mint {
  ll x;

public:
  mint(ll x = 0) : x((x % MOD + MOD) % MOD) {}

  mint operator-() const { return mint(-x); }

  mint &operator+=(const mint &a) {
    if ((x += a.x) >= MOD)
      x -= MOD;
    return *this;
  }

  mint &operator-=(const mint &a) {
    if ((x += MOD - a.x) >= MOD)
      x -= MOD;
    return *this;
  }

  mint &operator*=(const mint &a) {
    (x *= a.x) %= MOD;
    return *this;
  }

  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }

  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }

  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }

  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(MOD - 2); }

  mint &operator/=(const mint &a) { return (*this) *= a.inv(); }

  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }

  friend ostream &operator<<(ostream &os, const mint &m) {
    os << m.x;
    return os;
  }
};

const int MAX = 2000010;
mint fac[MAX], finv[MAX];

void COMinit() {
  fac[0] = fac[1] = 1;
  finv[0] = finv[1] = 1;
  for (int i = 2; i < MAX; i++) {
    fac[i] = fac[i - 1] * mint(i);
    finv[i] = finv[i - 1] * mint(i).inv();
  }
}

mint COM(int n, int k) {
  if (n < k)
    return mint(0);
  if (n < 0 || k < 0)
    return mint(0);
  // o(k)
  // if (k < MAX) {
  //     mint ret(1);
  //     Rep (i, k) {
  //         ret *= mint(n-i);
  //         ret /= mint(k-i);
  //     }
  //     return ret;
  // }

  return fac[n] * finv[k] * finv[n - k];
}

mint s(ll r, ll c) {
  mint a(0);
  Rep(i, r + 1) a += COM(i + 1 + c, c);
  return a;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  ll r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  r1--;
  c1--;

  COMinit();

  // cout << s(r2, c2) << "\n";

  cout << s(r2, c2) - s(r1, c2) - s(r2, c1) + s(r1, c1) << endl;
}