#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
typedef long long LL;

struct Rect {
	int x,y,xx,yy;
} rect[50001];


struct forsort {
	int a,l,r,id;
	bool operator<(const forsort &t) const {
		//if (a==t.a) assert(r<=t.l&&);
		return a!=t.a?a<t.a:r<=t.l;  //--  一开始写成了r<t.l...
	}
} pre[50001],nxt[50001];

int n;
LL area[50001];

int xs[50001];
int fin(int d) { return d==xs[d] ? d : xs[d]=fin(xs[d]); }
/*int fin(int d) {
	if (d==xs[d]) return d;
	return xs[d]=fin(xs[d]);
}*/
void uion(int a,int b) { a=fin(a); b=fin(b); xs[a]=b; }

void init() {
	FOR (i,1,n) area[i]=0;
	FOR (i,1,n) xs[i]=i;
}
bool isin(int a,int l,int r) {
	return a>=l&&a<=r;
}
void cl() {
	sort(pre+1,pre+1+n); sort(nxt+1,nxt+1+n);
	for (int i=1,j=1;i<=n&&j<=n;) {
		if (pre[i].a==nxt[j].a)
		if (!(pre[i].r<nxt[j].l||pre[i].l>nxt[j].r))  //--  区间相交条件：区间不相交取反...
			if (fin(pre[i].id)!=fin(nxt[j].id)) {
				uion(pre[i].id,nxt[j].id);
			}
		if (pre[i].a<nxt[j].a||(pre[i].a==nxt[j].a&&pre[i].r<nxt[j].r)) i++;
		else j++;
	}
}
int main() {
	for (;~scanf("%d",&n);) {
		init();
		for (int i=1;i<=n;i++) {
			int w,h;
			scanf("%d%d%d%d",&rect[i].x,&rect[i].y,&w,&h);
			rect[i].xx=rect[i].x+w;
			rect[i].yy=rect[i].y+h;
		}

		for (int i=1;i<=n;i++) {
			pre[i]=(forsort){rect[i].xx,rect[i].y,rect[i].yy,i};
			nxt[i]=(forsort){rect[i].x,rect[i].y,rect[i].yy,i};
		}
		cl();
		for (int i=1;i<=n;i++) {
			pre[i]=(forsort){rect[i].yy,rect[i].x,rect[i].xx,i};
			nxt[i]=(forsort){rect[i].y,rect[i].x,rect[i].xx,i};
		}
		cl();

		for (int i=1;i<=n;i++) {
			area[fin(i)]+=(rect[i].xx-rect[i].x)*(rect[i].yy-rect[i].y);
			//cout<<i<<" "<<fin(i)<<endl;
		}
		LL ans=0;
		for (int i=1;i<=n;i++) ans=max(ans,area[i]);
		cout<<ans<<endl;
	}
	return 0;
}


/*
	和标程对拍也是一个办法。

	把数据范围缩小（或是二分错误数据的范围，找到错误点），也是一个办法。
*/
