#include <cstdio>
#include <algorithm>
using namespace std;
struct rect {
long long x1, y1;
long long x2, y2;
rect() {}
rect(long long _x1, long long _y1, long long _x2, long long _y2):
x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
};
void swap(rect& a, rect& b)
{
rect c(a.x1, a.y1, a.x2, b.y2);
a = b;
b = c;
}
long long area(rect a)
{
return (a.x2 - a.x1) * (a.y2 - a.y1);
}
long long perimeter(rect a)
{
return 2 * (a.x2 - a.x1) + 2 * (a.y2 - a.y1);
}
long long intersect(rect a, rect b)
{
if (a.x1 > b.x1)
swap(a, b);
if (a.x2 < b.x1)
return 0;
if (a.y2 < b.y1)
return 0;
return (min(a.x2, b.x2) - max(a.x1, b.x1)) *
(min(a.y2, b.y2) - max(a.y1, b.y1));
}
long long intersect(rect a, rect b, rect c)
{
if (intersect(a, b) == 0 || intersect(a, c) == 0 ||
intersect(b, c) == 0)
return 0;
if (a.x1 > b.x1)
swap(a, b);
rect r;
r = rect(max(a.x1, b.x1), max(a.y1, b.y1),
min(a.x2, b.x2), min(a.y2, b.y2));
return intersect(r, c);
}
long long intersect_per(rect a, rect b)
{
if (a.x1 > b.x1)
swap(a, b);
if (a.x2 < b.x1)
return 0;
if (a.y2 < b.y1)
return 0;
return 2 * (min(a.x2, b.x2) - max(a.x1, b.x1)) +
2 * (min(a.y2, b.y2) - max(a.y1, b.y1));
}
long long intersect_per(rect a, rect b, rect c)
{
if (intersect_per(a, b) == 0 || intersect_per(a, c) == 0 ||
intersect_per(b, c) == 0)
return 0;
if (a.x1 > b.x1)
swap(a, b);
rect r;
r = rect(max(a.x1, b.x1), max(a.y1, b.y1),
min(a.x2, b.x2), min(a.y2, b.y2));
return intersect_per(r, c);
}
int main()
{
freopen("reuniune.in", "r", stdin);
freopen("reuniune.out", "w", stdout);
long long x1, y1, x2, y2;
rect r[3];
for (int i = 0; i < 3; ++i) {
scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
r[i] = rect(x1, y1, x2, y2);
}
printf("%lld", area(r[0]) + area(r[1]) + area(r[2]) -
intersect(r[0], r[1]) - intersect(r[1], r[2]) -
intersect(r[0], r[2]) + intersect(r[0], r[1], r[2]));
printf(" %lld\n", perimeter(r[0]) + perimeter(r[1]) + perimeter(r[2]) -
intersect_per(r[0], r[1]) - intersect_per(r[1], r[2]) -
intersect_per(r[0], r[2]) + intersect_per(r[0], r[1], r[2]));
return 0;
}