Problem:
Score : 600 points

Problem Statement

Snuke is standing on a two-dimensional plane. In one operation, he can move by 1 in the positive x-direction, or move by 1 in the positive y-direction.

Let us define a function f(r, c) as follows:

f(r,c) := (The number of paths from the point (0, 0) to the point (r, c) that Snuke can trace by repeating the operation above)

Given are integers r_1, r_2, c_1, and c_2.
Find the sum of f(i, j) over all pair of integers (i, j) such that r_1 ≤ i ≤ r_2 and c_1 ≤ j ≤ c_2, and compute this value modulo (10^9+7).

Constraints

1 ≤ r_1 ≤ r_2 ≤ 10^6

1 ≤ c_1 ≤ c_2 ≤ 10^6

All values in input are integers.

Input

Input is given from Standard Input in the following format:

r_1 c_1 r_2 c_2

Output

Print the sum of f(i, j) modulo (10^9+7).

Sample Input 1

1 1 2 2

Sample Output 1

14

For example, there are two paths from the point (0, 0) to the point (1, 1): (0,0) → (0,1) → (1,1) and (0,0) → (1,0) → (1,1), so f(1,1)=2.

Similarly, f(1,2)=3, f(2,1)=3, and f(2,2)=6. Thus, the sum is 14.

Sample Input 2

314 159 2653 589

Sample Output 2

602215194

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
#define lose {printf("NO\n");return;}
#define win {printf("YES\n");return;}
#define all(A) (A).begin(),(A).end()
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define PER(I, A, B) for (int I = (A); I >= (B); --I)
#define DB(A) cout<<(A)<<endl 
#define lson k*2
#define rson k*2+1
#define fi first
#define se second
#define PB push_back
#define Pair pair<int,int>
#define MP make_pair
#define LL long long
#define ull unsigned long long
#define int LL
using namespace std;
#define DB1(args...) do { cout << #args << " : "; dbg(args); } while (0)
void dbg() { std::cout << "  #\n"; }
template<typename T, typename...Args>
void dbg(T a, Args...args) { std::cout << a << ' '; dbg(args...); }
//var
const int maxn=1e6+10;
const int MAX=1e6;
const int inf=0x3f3f3f3f;   
const int mod=1e9+7;
//head
int n,m;
int a[maxn]; 

LL fac[maxn];
LL inv[maxn];
//LL facinv[maxn];
void fac_init()//reload fac, inv, facinv
{
    fac[0]=fac[1]=1;//both 0 1 initiate
    for (int i=1;i<=MAX;i++) fac[i]=(fac[i-1]*(i%mod))%mod;
    inv[0]=inv[1]=1;    
    for(int i=2;i<=MAX;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    
//	facinv[0]=facinv[1]=1;
//	for(int i=2;i<=MAX;i++) facinv[i]=inv[i];    
//  for(int i=2;i<=MAX;i++) facinv[i]=facinv[i]*facinv[i-1]%mod;
}
LL fpow(LL x, LL power, LL mod) 
{
    x %= mod;
    LL ans = 1;
    for (; power; power >>= 1, (x *= x) %= mod)
        if(power & 1) (ans *= x) %= mod;
    return ans;
}
LL qinv(LL a)
{
    LL x = fpow(a, mod - 2, mod);
    return x;
}
LL C(LL i,LL j)
{
	if (i<j) return 0;
	if (i<0||j<0) return 0;
//  return fac[i]*facinv[i-j]%mod*facinv[j]%mod;    
    return fac[i]*qinv(fac[i-j])%mod*qinv(fac[j])%mod;
}

int G(int row,int col)
{
	int ans=0;
	FOR(j,0,col)
	{
		ans+=C(j+row+1,row);
		ans%=mod;
	}
	return ans;
}

signed main()
{
	fac_init();
	int r1,c1,r2,c2;
	cin>>r1>>c1>>r2>>c2;
	int a1=G(r2,c2);
	int a2=G(r2,c1-1);
	int a3=G(r1-1,c2);
	int a4=G(r1-1,c1-1);
	int ans=(a1-a2-a3+a4);
	while (ans<mod) ans+=mod;
	ans%=mod;
	DB(ans);
}