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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		string[] str = Console.ReadLine().Split();
		long r1 = long.Parse(str[0]);
		long c1 = long.Parse(str[1]);
		long r2 = long.Parse(str[2]);
		long c2 = long.Parse(str[3]);
		long mod = 1000000007;
		long A = 1;
		long B4 = 0;
		for(var i=0;i<=r1-1;i++){
			A = A * (i+c1-1+1) % mod * Mpow(i+1,mod-2,mod) % mod;
			B4 = (B4 + A) % mod;
		}
		long B3 = B4;
		for(var i=r1;i<=r2;i++){
			A = A * (i+c1-1+1) % mod * Mpow(i+1,mod-2,mod) % mod;
			B3 = (B3 + A) % mod;
		}
		A = 1;
		long B2 = 0;
		for(var i=0;i<=r1-1;i++){
			A = A * (i+c2+1) % mod * Mpow(i+1,mod-2,mod) % mod;
			B2 = (B2 + A) % mod;
		}
		long B = B2;
		for(var i=r1;i<=r2;i++){
			A = A * (i+c2+1) % mod * Mpow(i+1,mod-2,mod) % mod;
			B = (B + A) % mod;
		}
		Console.WriteLine((B-B2-B3+B4+mod+mod)%mod);
	}
	public static long Mpow(long x,long n,long m)
	{
		long ans = 1;
		while(n > 0){
			if(n % 2 == 1){
				ans = ans * x % m;
				n -= 1;
			}
			x = x * x % m;
			n /= 2;
		}
		return ans;
	}
}