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
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

const int n2 = 1<<20;

const int N = 100005;

struct pro
{
	int x1, x2, y1, y2;
	void popraw( pro A )
	{
//		printf("polacz %d %d %d %d i %d %d %d %d\n",x1,x2,y1,y2,A.x1,A.x2,A.y1,A.y2 );
		x1 = min( A.x1, x1 );
		x2 = max( A.x2, x2 );
		y1 = min( A.y1, y1 );
		y2 = max( A.y2, y2 );
	}
};

pro wsp[N];
bool usu[N];
pro corr[N];
vector <int> pop;

bool cmp2(pro A,pro B)
{
	if (A.x1 != B.x1) return A.x1 < B.x1;
	if (A.x2 != B.x2) return A.x2 < B.x2;
	if (A.y1 != B.y1) return A.y1 < B.y1;
	return A.y2 < B.y2;
}

inline int miesci(int a)
{
	for (int i=0;i<pop.size();i++)
		if ( max(wsp[ pop[i] ].x1, wsp[ a ].x1) < min(wsp[ pop[i] ].x2, wsp[ a ].x2) &&
			 max(wsp[ pop[i] ].y1, wsp[ a ].y1) < min(wsp[ pop[i] ].y2, wsp[ a ].y2) ) return i;
	return -1;
}

int main()
{
	int n,a,b,c,d;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d%d%d", &wsp[i].x1, &wsp[i].x2, &wsp[i].y1, &wsp[i].y2 );
	}
//	sort( wsp+1, wsp+n+1, cmp );
	for (int i=1;i<=n;i++)
	{
		//Czytanie na jakie przedziały wejdziemy
		a = miesci( i );
		while( a!=-1 )
		{		
			//Usuwanie przedziałów na które weszliśmy i poprawianie naszej wartości
			usu[ pop[a] ] = 1;
			wsp[i].popraw( wsp[ pop[a] ] );
			swap( pop[ a ], pop.back() );
			pop.pop_back(); 
			a = miesci( i );
		}

		//Wstawianie nowych wartości na drzewo
		pop.push_back( i );
	}
	//Wypisywanie wyniku
	int C = 0;
	for (int i=1;i<=n;i++)
		if (usu[i]==0) corr[ C++ ] = wsp[i];
	sort( corr, corr+C, cmp2 );
	printf("%d\n",C);
	for (int i=0;i<C;i++) printf("%d %d %d %d\n",corr[i].x1, corr[i].x2, corr[i].y1, corr[i].y2);
	return 0;
}