//http://www.infoarena.ro/problema/Reuniune
#include <iostream>
#include <algorithm>
#include <list>
#include <fstream>
using namespace std;
class Dreptunghi {
public:
long long int x0, y0, x1, y1;
long long int dx, dy;
Dreptunghi(): x0(0), y0(0), x1(0), y1(0) {
dx = dy = 0;
}
Dreptunghi(long long int x0, long long int y0, long long int x1, long long int y1): x0(x0), y0(y0), x1(x1), y1(y1) {
dx = abs(x1 - x0);
dy = abs(y1 - y0);
}
long long int perimetru() {
return 2 * abs(x0 - x1) + 2 * abs(y0 - y1);
}
long long int arie() {
return abs(x0 - x1) * abs(y0 - y1);
}
Dreptunghi *intersectie(Dreptunghi o) {
Dreptunghi *i = new Dreptunghi();
i->x0 = max(o.x0, x0);
i->y0 = max(o.y0, y0);
i->x1 = min(o.x1, x1);
i->y1 = min(o.y1, y1);
return i;
}
// Rezultatul nu e neaparat un dreptunghi, ci mai degraba
// un "bounding box" pentru reuniunea celor doua dreptunghiuri
// cat mai strans posibil.
Dreptunghi *reuniune(Dreptunghi o) {
Dreptunghi *r = new Dreptunghi();
r->x0 = min(x0, o.x0);
r->y0 = min(y0, o.y0);
r->x1 = max(x1, o.x1);
r->y1 = max(y1, o.y1);
return r;
}
friend ostream& operator<< (ostream &out, Dreptunghi &d) {
out << "(" << d.x0 << "," << d.y0 << "),(" << d.x1 << "," << d.y1 << ")";
return out;
}
friend ostream& operator<< (ostream &out, Dreptunghi *&d) {
out << *d;
return out;
}
};
void arie_perimetru(Dreptunghi d1, Dreptunghi d2, Dreptunghi d3,
long long int &arie, long long int &perimetru) {
// verifica daca dreptunghiurile se ating; daca nu se pot
// reuniuni, atunci aria si perimetrul sunt 0.
long long int dx = abs(min(min(d1.x0,d2.x0),d3.x0) - max(max(d1.x1, d2.x1),d3.x1));
long long int dy = abs(min(min(d1.y0,d2.y0),d3.y0) - max(max(d1.y1, d2.y1),d3.y1));
if (dx >= d1.dx + d2.dx + d3.dx || dy >= d1.dy + d2.dy + d3.dy) {
arie = perimetru = 0;
return;
}
Dreptunghi *d12 = d1.intersectie(d2);
Dreptunghi *d13 = d1.intersectie(d3);
Dreptunghi *d23 = d2.intersectie(d3);
Dreptunghi *d123 = d23->intersectie(d1);
arie = d1.arie() + d2.arie() + d3.arie() -
d12->arie() - d13->arie() - d23->arie() +
d123->arie();
// Calculeaza dreptunghi "bounding box" pentru reuniunea
// dreptunghiurilor.
Dreptunghi *r12 = d1.reuniune(d2);
Dreptunghi *r123 = r12->reuniune(d3);
perimetru = r123->perimetru();
delete d12;
delete d13;
delete d23;
delete d123;
delete r12;
delete r123;
}
int main() {
ifstream ifs("reuniune.in");
if (!ifs) {
cerr << "Err deschidere fisier" << endl;
exit(1);
}
long long int x0, x1, y0, y1;
long long int arie, perimetru;
ifs >> x0 >> y0 >> x1 >> y1;
Dreptunghi d1(x0, y0, x1, y1);
ifs >> x0 >> y0 >> x1 >> y1;
Dreptunghi d2(x0, y0, x1, y1);
ifs >> x0 >> y0 >> x1 >> y1;
Dreptunghi d3(x0, y0, x1, y1);
// caz cand nu se ating niciunul dintre ele, reuniunea e vida.
arie_perimetru(d1, d2, d3, arie, perimetru);
ofstream ofs("reuniune.out");
if (!ofs) {
cerr << "Err deschidere fisier" << endl;
exit(1);
}
ofs << arie << " " << perimetru;
return 0;
}