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
119
120
#include <iostream>
#include <stdio.h>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;

int n;
int xxx1[100000];
int xxx2[100000];
int yyy1[100000];
int yyy2[100000];
int repr[100000];
int repx, repy;
int ffind(int x);
int funion(int a, int b);
bool zmiana = false;
int xx1, xx2, yy1, yy2, rozmx, rozmy;
bool uzyte[100000];
vector < pair <int, pair <int, pair <int, int> > > > plemiona;
int ile_plemion = 0;

int main()
{
	scanf("%d", &n);
	
	for(int i = 0; i < n; i++) repr[i] = i;
	
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &xxx1[i]);
		scanf("%d", &xxx2[i]);
		scanf("%d", &yyy1[i]);
		scanf("%d", &yyy2[i]);
		
		if(xxx1[i] > xxx2[i]) swap(xxx1[i], xxx2[i]);
		if(yyy1[i] > yyy2[i]) swap(yyy1[i], yyy2[i]);
	}
	
	while(1)
	{
		zmiana = false;
		
		for(int x = 0; x < n; x++)
		{
			for(int y = 0; y < n; y++)
			{
				repx = ffind(x);
				repy = ffind(y);
			
				if(repx == repy) continue;
			
				xx1 = max(xxx1[x], xxx1[y]);
				xx2 = min(xxx2[x], xxx2[y]);
				yy1 = max(yyy1[x], yyy1[y]);
				yy2 = min(yyy2[x], yyy2[y]);
				
				rozmx = xx2-xx1;
				rozmy = yy2-yy1;

				if(rozmx > 0 && rozmy > 0)
				{
					funion(x, y);
					zmiana = true;
					
					int reprez = ffind(y);
					
					xxx1[reprez] = min(xxx1[x], xxx1[y]);
					xxx2[reprez] = max(xxx2[x], xxx2[y]);
					yyy1[reprez] = min(yyy1[x], yyy1[y]);
					yyy2[reprez] = max(yyy2[x], yyy2[y]);
				}
			}
		}
		
		if(zmiana == false) break;
	}
	
	for(int i = 0; i < n; i++)
	{
		repx = ffind(i);
		
		if(uzyte[repx] == false)
		{
			uzyte[repx] = true;
			ile_plemion += 1;
			
			plemiona.push_back(make_pair(xxx1[repx],make_pair(xxx2[repx],make_pair(yyy1[repx],yyy2[repx]))));
		}
	}
	
	sort(plemiona.begin(), plemiona.end());
	
	printf("%d\n", ile_plemion);
		
	for(int i = 0; i < ile_plemion; i++)
	{
		printf("%d ", plemiona[i].first);
		printf("%d ", plemiona[i].second.first);
		printf("%d ", plemiona[i].second.second.first);
		printf("%d", plemiona[i].second.second.second);
		printf("\n");
	}
	
	return 0;
}

int ffind(int x)
{
    if(repr[x] == x) return x;
    else { repr[x] = ffind(repr[x]); return repr[x]; }
}

int funion(int a, int b)
{
    int repa = ffind(a);
    int repb = ffind(b);
    
    repr[repb] = repa;
}