#include <cstdio>
#include <algorithm>
using namespace std;
const long long INF = (1LL << 31);
struct punct {
long long X1, Y1, X2, Y2;
} P[10];
long long A, B, C, ACUB, ACUC, BCUC, ACUBCUC, XMAX, XMIN, YMAX, YMIN, X1, X2, Y1, Y2;
int cmpx (punct A, punct B) {
return A.X1 > B.X1;
}
int cmpy (punct A, punct B) {
return A.Y1 < B.Y1;
}
long long arie (int x, int y) {
if (P[y].X2 <= P[x].X2) {
if (P[y].Y1 < P[x].Y1) {
if (P[y].Y2 <= P[x].Y2)
return (P[y].X1 - P[x].X2) * (P[y].Y2 - P[x].Y1);
else
return (P[y].X1 - P[x].X2) * (P[x].Y2 - P[x].Y1);
}
else {
if (P[y].Y2 <= P[x].Y2)
return (P[y].X1 - P[x].X2) * (P[y].Y2 - P[y].Y1);
else
return (P[y].X1 - P[x].X2) * (P[x].Y2 - P[y].Y1);
}
}
else {
if (P[y].Y1 < P[x].Y1) {
if (P[y].Y2 <= P[x].Y2)
return (P[y].X1 - P[y].X2) * (P[y].Y2 - P[x].Y1);
else
return (P[y].X1 - P[y].X2) * (P[x].Y2 - P[x].Y1);
}
else {
if (P[y].Y2 <= P[x].Y2)
return (P[y].X1 - P[y].X2) * (P[y].Y2 - P[y].Y1);
else
return (P[y].X1 - P[y].X2) * (P[x].Y2 - P[y].Y1);
}
}
}
void citire () {
freopen ("reuniune.in", "r", stdin);
scanf ("%lld %lld %lld %lld", &P[1].Y1, &P[1].X2, &P[1].Y2, &P[1].X1);
scanf ("%lld %lld %lld %lld", &P[2].Y1, &P[2].X2, &P[2].Y2, &P[2].X1);
scanf ("%lld %lld %lld %lld", &P[3].Y1, &P[3].X2, &P[3].Y2, &P[3].X1);
}
void reuniune () {
freopen ("reuniune.out", "w", stdout);
int i;
sort (P + 1, P + 4, cmpx);
if (P[1].X2 >= P[2].X1) {
printf ("0 0"); return;
}
if (P[2].X2 >= P[3].X1) {
printf ("0 0"); return;
}
sort (P + 1, P + 4, cmpy);
if (P[1].Y2 <= P[2].Y1) {
printf ("0 0"); return;
}
if (P[2].Y2 <= P[3].Y1) {
printf ("0 0"); return;
}
sort (P + 1, P + 4, cmpx);
XMAX = P[1].X1;
for (XMIN = INF, i = 1; i <= 3; i++)
if (P[i].X2 < XMIN) XMIN = P[i].X2;
A = (P[1].X1 - P[1].X2) * (P[1].Y2 - P[1].Y1);
B = (P[2].X1 - P[2].X2) * (P[2].Y2 - P[2].Y1);
C = (P[3].X1 - P[3].X2) * (P[3].Y2 - P[3].Y1);
ACUB = arie (1, 2);
ACUC = arie (1, 3);
BCUC = arie (2, 3);
if (P[2].X2 <= P[1].X2) {
if (P[2].Y1 < P[1].Y1) {
if (P[2].Y2 <= P[1].Y2)
X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[1].X2, Y2 = P[2].Y2;
else
X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[1].X2, Y2 = P[1].Y2;
}
else {
if (P[2].Y2 <= P[1].Y2)
X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[1].X2, Y2 = P[2].Y2;
else
X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[1].X2, Y2 = P[1].Y2;
}
}
else {
if (P[2].Y1 < P[1].Y1) {
if (P[2].Y2 <= P[1].Y2)
X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[2].X2, Y2 = P[2].Y2;
else
X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[2].X2, Y2 = P[1].Y2;
}
else {
if (P[2].Y2 <= P[1].Y2)
X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[2].X2, Y2 = P[2].Y2;
else
X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[2].X2, Y2 = P[1].Y2;
}
}
if (P[3].X2 <= X2) {
if (P[3].Y1 < Y1) {
if (P[3].Y2 <= Y2)
ACUBCUC = (P[3].X1 - X2) * (P[3].Y2 - Y1);
else
ACUBCUC = (P[3].X1 - X2) * (Y2 - Y1);
}
else {
if (P[3].Y2 <= Y2)
ACUBCUC = (P[3].X1 - X2) * (P[3].Y2 - P[3].Y1);
else
ACUBCUC = (P[3].X1 - X2) * (Y2 - P[3].Y1);
}
}
else {
if (P[3].Y1 < Y1) {
if (P[3].Y2 <= Y2)
ACUBCUC = (P[3].X1 - P[3].X2) * (P[3].Y2 - Y1);
else
ACUBCUC = (P[3].X1 - P[3].X2) * (Y2 - Y1);
}
else {
if (P[3].Y2 <= Y2)
ACUBCUC = (P[3].X1 - P[3].X2) * (P[3].Y2 - P[3].Y1);
else
ACUBCUC = (P[3].X1 - P[3].X2) * (Y2 - P[3].Y1);
}
}
sort (P + 1, P + 4, cmpy);
YMIN = P[1].Y1;
for (YMAX = -INF, i = 1; i <= 3; i++)
if (P[i].Y2 > YMAX) YMAX = P[i].Y2;
printf ("%lld %lld", A + B + C - ACUB - ACUC - BCUC + ACUBCUC, (XMAX - XMIN + YMAX - YMIN) * 2);
}
int main () {
citire ();
reuniune ();
return 0;
}