#include <bits/stdc++.h>

using namespace std;

struct node {
	int val, L, R, id;
	node() {}
	node(int val, int L, int R, int id) : val(val), L(L), R(R), id(id) {}
};

int f[50010];
int S[50010];

int get(int x)
{
	if (f[x] != x) f[x] = get(f[x]);
	return f[x];
}

void gao(int L, int R, vector<node> &A)
{
	sort(A.begin(), A.end(), [](node a, node b){
			if (a.val != b.val) return a.val < b.val;
			return a.L <= b.L;
		});
	
	for (int i = L; i <= R; i++) {
		int j = i, mx = A[i].L - 1, id;
		while (j <= R && A[j].val == A[i].val) j++;
		for (int k = i; k < j; k++) {
			if (A[k].L <= mx) {
				int u = get(id);
				int v = get(A[k].id);
				f[u] = v;
			}
			if (A[k].R > mx) {
				mx = A[k].R;
				id = A[k].id;
			}
		}
		i = j - 1;
	}
}

int main()
{
	int n;
	while (scanf("%d", &n) != EOF) {
		vector<node> A, B;
		for (int i = 1; i <= n; i++) {
			int x0, y0, W, H;
			scanf("%d%d%d%d", &x0, &y0, &W, &H);
			S[i] = W * H;
			A.push_back(node(y0, x0, x0 + W, i));
			A.push_back(node(y0 + H, x0, x0 + W, i));
			B.push_back(node(x0, y0, y0 + H, i));
			B.push_back(node(x0 + W, y0, y0 + H, i));
			f[i] = i;
		}
		gao(0, 2 * n - 1, A);
		gao(0, 2 * n - 1, B);
		
		for (int i = 1; i <= n; i++) {
			int id = get(i);
			if (i == id) continue;
			S[id] += S[i];
		}
		int ans = 0;
		for (int i = 1; i <= n; i++) ans = max(ans, S[i]);
		printf("%d\n", ans);
	}
	return 0;
}
