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
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <cstdio>
#include <algorithm>
#include <list>

using namespace std;

#define MIN(a, b) a < b ? a : b
#define MAX(a, b) a > b ? a : b

#define MAXN 100000

typedef class _Punkt {
public:
	int x;
	int y;

	_Punkt() :
			x(0), y(0) {
	}

	_Punkt(int x, int y) :
			x(x), y(y) {
	}
} Punkt;

typedef class _Prostokat {
public:
	Punkt leftDown;
	Punkt rightUp;

	_Prostokat() :
			leftDown(), rightUp() {
	}

	_Prostokat(Punkt a, Punkt b) :
			leftDown(a), rightUp(b) {
	}

	void print() {
//		fprintf(stderr, "(%d %d) x (%d %d)\n", leftDown.x, leftDown.y,
//				rightUp.x, rightUp.y);
		printf("%d %d %d %d\n", leftDown.x, rightUp.x, leftDown.y, rightUp.y);
	}
} Prostokat;

bool przecina(Prostokat a, Prostokat b) {
	if ((a.rightUp.x <= b.leftDown.x) || (b.rightUp.x <= a.leftDown.x)
			|| (a.rightUp.y <= b.leftDown.y) || (b.rightUp.y <= a.leftDown.y)) {
		return false;
	}

	return true;
}

Prostokat przeciecie(Prostokat a, Prostokat b) {
	return Prostokat(
			Punkt(MIN(a.leftDown.x, b.leftDown.x),
					MIN(a.leftDown.y, b.leftDown.y)),
			Punkt(MAX(a.rightUp.x, b.rightUp.x),
					MAX(a.rightUp.y, b.rightUp.y)));
}


bool compare (const Prostokat& first, const Prostokat& second) {
	if (first.leftDown.x == second.leftDown.x) {
		if (first.rightUp.x == second.rightUp.x) {
			if (first.leftDown.y == second.leftDown.y) {
				return first.rightUp.y < second.rightUp.y;
			} else {
				return first.leftDown.y < second.leftDown.y;
			}
		} else {
			return first.rightUp.x < second.rightUp.x;
		}
	} else {
		return first.leftDown.x < second.leftDown.x;
	}
}

list<Prostokat> prostokaty;

void dodaj(Prostokat p) {
	for (list<Prostokat>::iterator it = prostokaty.begin(); it != prostokaty.end(); ++it) {
		if (przecina(*it, p)) {
			Prostokat r = przeciecie(*it, p);
			prostokaty.erase(it);
			dodaj(r);
			return;
		}
	}

	prostokaty.push_back(p);
}

int main() {
	int n;

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		int x1, x2, y1, y2;

		scanf("%d %d %d %d", &x1, &x2, &y1, &y2);

		dodaj(Prostokat(Punkt(x1, y1), Punkt(x2, y2)));
	}

	prostokaty.sort(compare);

	printf("%lu\n", prostokaty.size());

	for (list<Prostokat>::iterator it = prostokaty.begin();
			it != prostokaty.end(); ++it) {
		it->print();
	}

	return 0;
}