-157778763 218978790 976692563 591093088
 -1 -4 1 4
 -999999999 -1000000000 -1 0
 1000000000 1000000000 1000000000 1000000000
 -2 -3 -2 1
 -1000000000 -999999999 1000000000 999999999
 0 -1 0 1
 -999999999 -999999999 999999999 999999999
 -946749893 -687257665 -539044455 -443568671
 -26644507 -867720841 975594569 264730225
 309857887 -687373066 663986893 403321752
 -2 -2 -2 0
 0 -2 0 2
 0 -1 2 1
 -2 -2 2 2
 -999999999 -1000000000 999999999 1000000000
 -330513944 -970064382 500608496 369852884
 0 -3 0 3
 0 0 2 2
 -946749893 -687257666 -539044455 -443568670
 -330513944 -970064383 500608496 369852885
 -1000000000 -1000000000 1000000000 1000000000
 0 -1 2 3
 -999999999 -999999999 -1 -1
 309857887 -687373065 663986893 403321751
 -482406510 -512306895 412844236 -168036049
 0 0 2 0
 0 0 0 0
 -471257905 -685885154 782342299 909511044
 -482406510 -512306894 412844236 -168036050
 -157778763 218978791 976692563 591093087
 -411495869 33834653 -234317741 925065545
 -2 -3 2 3
 -411495869 33834652 -234317741 925065546
 -26644507 -867720842 975594569 264730226
 -537640548 -254017710 62355638 588691834
 -471257905 -685885153 782342299 909511043
 -1 -3 1 3
 1000000000 999999999 1000000000 999999999
 1 0 5 6
 -537640548 -254017711 62355638 588691835

211076501291102387 14 500000000000000000 1 3 2000000000000000000 2 1999999998000000001 49676664342971903 567493356068872580 193123336596257367 2 3 5 13 2000000000000000000 556817654843544374 4 5 49676664750677342 556817655674666815 2000000002000000001 8 499999999000000001 193123336242128360 154104366473536355 2 1 999994501061310398 154104365578285608 211076500156631060 78953311064369599 18 78953311241547728 567493357071111657 252811256874252458 999994499807710193 11 1 18 252811257474248645
#include <bits/stdc++.h>
using namespace std;
void init() {
  ios::sync_with_stdio(0);
  srand(time(0));
}
void pause() { puts(""); }
void scanBigInteger(vector<short> &A) {
  string s;
  cin >> s;
  for (int x = s.length() - 1; x >= 0; x--) {
    A.push_back(s[x] - '0');
  }
}
void printBigInteger(vector<short> A) {
  if (A.empty())
    cout << 0 << endl;
  else
    for (int x = A.size() - 1; x >= 0; x--) cout << A[x];
}
void swap(vector<short> &A, vector<short> &B) {
  vector<short> C = A;
  A = B;
  B = C;
}
void convert(vector<short> &A, vector<short> &B) {
  if (A.size() > B.size())
    while (abs((int)A.size() - (int)B.size())) B.push_back(0);
  if (A.size() < B.size())
    while (abs((int)A.size() - (int)B.size())) A.push_back(0);
}
void normalize(vector<short> &A) {
  while (A.size() && A[A.size() - 1] == 0) A.pop_back();
}
bool operator>(vector<short> A, vector<short> B) {
  if (A.size() > B.size()) return true;
  if (A.size() < B.size())
    return false;
  else {
    for (int i = A.size() - 1; i >= 0; i--) {
      if (A[i] == B[i]) continue;
      if (A[i] > B[i]) return true;
      if (A[i] < B[i]) return false;
    }
    return false;
  }
}
bool operator<(vector<short> A, vector<short> B) {
  if (A.size() > B.size()) return false;
  if (A.size() < B.size())
    return true;
  else {
    for (int i = A.size() - 1; i >= 0; i--) {
      if (A[i] == B[i]) continue;
      if (A[i] > B[i]) return false;
      if (A[i] < B[i]) return true;
    }
    return false;
  }
}
bool operator!=(vector<short> A, vector<short> B) {
  if (A.size() != B.size()) return true;
  bool notequal = false;
  for (int i = 0; i < A.size() && !notequal; i++) {
    if (A[i] != B[i]) notequal = true;
  }
  return notequal;
}
bool operator==(vector<short> A, vector<short> B) {
  if (A.size() != B.size()) return false;
  bool equal = true;
  for (int i = 0; i < A.size() && equal; i++) {
    if (A[i] != B[i]) equal = false;
  }
  return equal;
}
bool operator<=(vector<short> A, vector<short> B) { return (A < B) | (A == B); }
bool operator>=(vector<short> A, vector<short> B) { return (A > B) | (A == B); }
vector<short> operator+(vector<short> A, vector<short> B) {
  vector<short> C;
  convert(A, B);
  int carry = 0;
  for (int i = 0; i < A.size(); i++) {
    carry += A[i] + B[i];
    C.push_back(carry % 10);
    carry /= 10;
  }
  if (carry) C.push_back(carry);
  return C;
}
vector<short> operator-(vector<short> A, vector<short> B) {
  if (B > A) swap(A, B);
  int carry = 0;
  for (int i = 0; i < A.size(); i++) {
    A[i] -= carry + int(i < B.size() ? B[i] : 0);
    carry = int(A[i] < 0);
    if (carry) A[i] += 10;
  }
  while (A.size() && A[A.size() - 1] == 0) A.pop_back();
  return A;
}
vector<short> operator*(vector<short> A, vector<short> B) {
  if (B > A) swap(A, B);
  vector<short> C;
  C.resize(A.size() + B.size());
  int slice = 0;
  for (int i = 0; i < A.size(); i++) {
    for (int j = 0; j < B.size() || slice; j++) {
      int tmp = C[i + j] + slice + (j < B.size() ? B[j] : 0) * A[i];
      C[i + j] = tmp % 10;
      slice = tmp / 10;
    }
  }
  while (C.size() && C[C.size() - 1] == 0) C.pop_back();
  return C;
}
long long power(long double a, long long b) {
  if (b < 2) return b ? a : 1;
  return (power((a * a), b / 2) * (b % 2 ? a : 1));
}
int main() {
  init();
  long long x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  cout << ((y2 - y1) / 2 + 1) * (x2 - x1 + 1) - (x2 - x1) / 2;
  pause();
  return 0;
}
