1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <cstdio>
#include <vector>
#include <algorithm>
#define PB push_back
using namespace std;

struct q {
	int x1, x2, y1, y2;
} el;

vector<q> tab;

int n;
bool dzialaj;

bool intersect(q el1, q el2) {
	return !(el2.x1 >= el1.x2 || el2.y1 >= el1.y2 || el2.x2 <= el1.x1 || el2.y2 <= el1.y1); 
}

void merge() {
	q el1 = tab[tab.size()-1];
	tab.pop_back();
	q el2 = tab[tab.size()-1];
	tab.pop_back();
	if(intersect(el1,el2)) {
		q el3;
		el3.x1 = min(el1.x1, el2.x1);
		el3.y1 = min(el1.y1, el2.y1);
		el3.x2 = max(el1.x2, el2.x2);
		el3.y2 = max(el1.y2, el2.y2);
		tab.PB(el3);
		dzialaj = true;
	}
	else {
		tab.PB(el1);
		tab.PB(el2);
	}
return ;
}

bool cmp(const q &el1, const q & el2) {
	return (el1.x1 < el2.x1) || (el1.x1 == el2.x1 && el1.x2 < el2.x2) || (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 < el2.y1)
			|| (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 == el2.y1 && el1.y2 < el2.y2);
}

int main () {
	scanf("%d",&n);
	for(int i = 0; i < n; ++i) {
		scanf("%d%d%d%d",&el.x1,&el.x2,&el.y1,&el.y2);
		tab.PB(el);
	}
	dzialaj = true;
	while(dzialaj == true) {
		dzialaj = false;

		for(int i = tab.size()-1; i >= 0; --i) {
			for(int j = i-1; j >= 0; --j) {
				if(intersect(tab[i], tab[j])) {
					swap(tab[i],tab[max((int)tab.size()-1,0)]);
					swap(tab[j],tab[max((int)tab.size()-2,0)]);
					merge();
				}
			}
		}
	}
	
	printf("%d\n", (int)tab.size());
	sort(tab.begin(), tab.end(), cmp);
	for(int i = 0; i < tab.size(); ++i) {
		printf("%d %d %d %d\n", tab[i].x1, tab[i].x2, tab[i].y1, tab[i].y2);
	}
}