#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<iomanip>
#include<sstream>
#include<map>
#include<set>
#include<cmath>
using namespace std;
template<typename A, size_t N, typename T>
void Fill(A(&array)[N], const T& val) {
	std::fill((T*)array, (T*)(array + N), val);
}
#define rep(i,n) for(int i = 0;i < n;i++)
#define req(i,n) for(int i = 1;i <=n;i++)
#define rrep(i,n) for(int i = n -1;i >= 0;i--)
#define ALL(a) a.begin(),a.end()
#define RALL(a) a.rbegin(),a.rend()
typedef long long ll;
typedef long double ld;
typedef unsigned long long int ull;
const ll INF = 1LL << 60;
const int inf = 1 << 25;
ll n, m, k, y, x, h, w = -1, num=0, sum, ans = 0; string s;
template <typename T>
vector<T> compress(vector<T>& C1, vector<T>& C2) {
	vector<T> vals;
	int N = C1.size();
	rep(i, N) {
		rep(d, 1) {
			T tc1 = C1[i] + d, tc2 = C2[i] + d;
			vals.push_back(tc1);
			vals.push_back(tc2);
		}
	}sort(ALL(vals));
	vals.erase(unique(ALL(vals)), vals.end());
	rep(i, n) {
		C1[i] = lower_bound(ALL(vals), C1[i]) - vals.begin();
		C2[i] = lower_bound(ALL(vals), C2[i]) - vals.begin();
	}return vals;
}
int main(void) {
	cin >> n; vector<ll> X1(n), X2(n), Y1(n), Y2(n);
	rep(i, n) cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
	vector<ll> X = compress(X1, X2), Y = compress(Y1, Y2);
	w = X.size(); h = Y.size();
	vector<vector<int>> G(w, vector<int>(h));
	rep(i, n) {
		G[X1[i]][Y1[i]]++;
		G[X2[i]][Y2[i]]++;
		G[X1[i]][Y2[i]]--;
		G[X2[i]][Y1[i]]--;
	}req(i, w - 1) {
		rep(j, h) {
			G[i][j] += G[i - 1][j];
		}
	}
	rep(i, w) {
		req(j, h - 1) {
			G[i][j] += G[i][j - 1];
		}
	}
	rep(i, w - 1) {
		rep(j, h - 1) {
			if (G[i][j]) ans += (X[i + 1] - X[i]) * (Y[j + 1] - Y[j]);
		}
	}cout << ans << endl;
}
