using namespace std;
#include<string>
#include<cmath>
#include<list>
#include <map>
#include <unordered_map>
#include <set>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ml map<ll,ll>
#define pb push_back
#define mp make_pair
#define ppl pair<ll,ll>
#define F first
#define S second
#define fio ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)

#define fr(i,a,b) for(ll i=a;i<b;i++)
#define ffr(i,a,b) for(ll i=a;i>=b;i--)
#include<bits/stdc++.h>
#include<vector>
#define vl vector<ll>
#define PI 3.141592654
const ll N = 998244353;
#include<iterator>
#define EPSILON numeric_limits<double>::epsilon()



//vector<vl>vx(202, vl()), vy(202, vl());
//vector<vl> v;
// vl b;
// vector<bool> visited;

// void dfs(ll pnt, ll &ma) {
// 	ma++;
// 	fr(i, 0, v[pnt].size()) {
// 		ll cnt = 0;
// 		dfs(v[pnt][i], cnt);
// 		ma = max(cnt, ma);
// 	}
// 	b.pb(ma + 1);
// }

// vl pr(N, 0);

// void prime() {
// 	fr(i, 2, N + 1) {
// 		if (!pr[i]) {
// 			for (ll j = i * 2; j <= N; j += i)pr[j] = 1;
// 		}
// 	}
// }

// ll gcd(ll a, ll b) {
// 	if (a == b)return a;
// 	if (a % b == 0)return b;
// 	if (b % a == 0)return a;
// 	if (b > a)return gcd(a, b % a);
// 	if (a > b)return gcd(a % b, b);
// 	return 0;
// }

// ll fact(ll n) {
// 	ll res = 1;
// 	fr (i, 2, n + 1) res = res * i;
// 	return res;
// }

// ll nCr(ll n, ll r) {
// 	return fact(n) / (fact(r) * fact(n - r));
// }



void solve() {
	ll a, b, c, d; cin >> a >> b >> c >> d;
	cout << (a * d) - (b * c);

}






int main() {
	fio;
#ifndef ONLINE_JUDGE
	// for getting input
	freopen("input.txt", "r", stdin);
	//for writing output
	freopen("jout.txt", "w", stdout);
#endif
	//prime();
	ll t;
	if (1)
		t = 1;
	else
		cin >> t;
	while (t--) {
		//cout << "Case #" << h << ": ";
		solve();
		//h++;
		cout << '\n';
	}
	return 0;
}

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
using namespace std;
using Graph = vector<vector<int>>;
typedef long long ll;

struct UnionFind{
    vector<int> par, siz;

    UnionFind(int n) : par(n,-1) , siz(n,1) {}

    int root(int x){
        if (par[x] == -1) return x;
        else return par[x] = root(par[x]);
    }

    bool issame(int x,int y){
        return root(x) == root(y);
    }

    bool unite(int x,int y){
        x = root(x);y=root(y);
        if(x == y) return false;
        if(siz[x] < siz[y]) swap(x,y);
        par[y] = x;
        siz[x] += siz[y];
        return true;
    }

    int size(int x){
        return siz[root(x)];
    }
};
// UnionFind uf(N) とかやってあげると0からN-1までを含むバラバラの集合が手に入る
// root(x) <- ルートを返してくれる,ルートが同じなら同じ集合にいるぞ！
// unite(x.y) <- x,yが含まれている集合を合体させる

int main(){
    int a,b,c,d;
    cin >> a >> b;
    cin >> c >> d;
    cout << a*d - b*c << endl;

}
