Last year the world's largest square was built in Berland. It is known that the square can be represented as an infinite plane with an introduced Cartesian system of coordinates. On that square two sets of concentric circles were painted. Let's call the set of concentric circles with radii 1, 2, ..., K and the center in the point (z, 0) a (K, z)-set. Thus, on the square were painted a (N, x)-set and a (M, y)-set. You have to find out how many parts those sets divided the square into.

Input

The first line contains integers N, x, M, y. (1 ≤ N, M ≤ 100000, - 100000 ≤ x, y ≤ 100000, x ≠ y).

Output

Print the sought number of parts.

Examples

Input

1 0 1 1


Output

4


Input

1 0 1 2


Output

3


Input

3 3 4 7


Output

17

Note

Picture for the third sample:

<image>
import java.util.*;
import java.io.*;
import java.math.*;
import static java.lang.Math.*;

public class Main implements Runnable {
	BufferedReader in;
	PrintStream out;
    //PrintWriter out;
    StringTokenizer st = new StringTokenizer("");

        public static void main(String [] args) throws Exception {
		new Thread(new Main()).start();
	}




    public void run() {
		try {
            //double eps = 1e-7;
            Locale.setDefault(Locale.US);
            //String s;
            in = new BufferedReader(new InputStreamReader(System.in));
            //in = new BufferedReader(new FileReader("cards.in"));
            //out = new PrintWriter("cards.out");
            out = new PrintStream(System.out);
            int n = nextInt(); int x = nextInt();
            int m = nextInt(); int y = nextInt();
            int t = abs(x-y); long ans = 0; int f = 0;
            for (int a=1; a<=n; a++){
                f = t-a; if (f<0) f=-f-1;
                if (m<=f) ans++;
                else{
                    if (m>=t+a) ans+=(t+a-1-(f+1))*2+2;
                    else ans+= ((m-(f+1))*2+2);
                }
            }
            for (int b=1; b<=m; b++){
                if (b+t>n) ans++;
            }
            ans++;
            out.print(ans);
        }
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	 boolean seekForToken() {
 		try {
			while (!st.hasMoreTokens()) {
				String s = in.readLine();
				if (s == null) {
				 	return false;
				}
			 	st = new StringTokenizer(s);
			}
			return true;
		}
		catch (IOException e) {
		 	e.printStackTrace();
		 	return false;
		}
 	}

 	 int nextInt() {
		return Integer.parseInt(nextToken());
 	}

 	 long nextLong() {
		return Long.parseLong(nextToken());
 	}

 	 double nextDouble() {
		return Double.parseDouble(nextToken());
 	}

 	 BigInteger nextBigInteger() {
 	 	return new BigInteger(nextToken());
 	}

 	 String nextToken() {
 	 	seekForToken();
 	 	return st.nextToken();
 	}

}
