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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <bits/stdc++.h>
//#include <emmintrin.h>

using namespace std;

#define FORE(it,c)  for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define FOR(i,a,b)  for(int i=(a);i<(b);++i)
#define REP(i,a)    FOR(i,0,a)
#define ZERO(m)    memset(m,0,sizeof(m))
#define ALL(x)      x.begin(),x.end()
#define PB          push_back
#define S          size()
#define LL          long long
#define ULL        unsigned long long
#define LD          long double
#define MP          make_pair
#define X          first
#define Y          second
#define VC          vector
#define PII        pair <int, int>
#define VI          VC < int >
#define VVI        VC < VI >
#define VD          VC < double >
#define VVD        VC < VD >
#define VS          VC < string >
#define DB(a)      cerr << #a << ": " << (a) << endl;

template<class T> void print(VC < T > v) {cerr << "[";if (v.S) cerr << v[0];FOR(i, 1, v.S) cerr << ", " << v[i];cerr << "]\n";}
template<class T> string i2s(T x) {ostringstream o; o << x; return o.str(); }
VS splt(string s, char c = ' ') {VS all; int p = 0, np; while (np = s.find(c, p), np >= 0) {if (np != p) all.PB(s.substr(p, np - p)); p = np + 1;} if (p < s.S) all.PB(s.substr(p)); return all;}

const int MAX_N = 100000;

int N;

struct RECT {
	int x1;
	int x2;
	int y1;
	int y2;
	bool operator<(const RECT &r) const {
		if (x1 != r.x1) return x1 < r.x1;
		if (x2 != r.x2) return x2 < r.x2;
		if (y1 != r.y1) return y1 < r.y1;
		return y2 < r.y2;
	}
};

RECT P[MAX_N];

bool cross(int a0, int a1, int b0, int b1) {
	return min(a1, b1) > max(a0, b0);
}

void solveBF() {
	REP(i, N) {
		again:
		REP(j, N) if (i != j) {
			if (!cross(P[i].x1, P[i].x2, P[j].x1, P[j].x2)) continue;
			if (!cross(P[i].y1, P[i].y2, P[j].y1, P[j].y2)) continue;
			P[i].x1 = min(P[i].x1, P[j].x1);
			P[i].x2 = max(P[i].x2, P[j].x2);
			P[i].y1 = min(P[i].y1, P[j].y1);
			P[i].y2 = max(P[i].y2, P[j].y2);
			if (i == N - 1) {
				swap(P[i--], P[j]);
				swap(P[j], P[--N-1]);
			} else {
				swap(P[j], P[--N]);
			}
			goto again;
		}
	}
	sort(P, P + N);
	printf("%d\n", N);
	REP(i, N) printf("%d %d %d %d\n", P[i].x1, P[i].x2, P[i].y1, P[i].y2);
}

int main() {
	scanf("%d", &N);
	REP(i, N) scanf("%d%d%d%d", &P[i].x1, &P[i].x2, &P[i].y1, &P[i].y2);
	
	solveBF();
	
	return 0;
}