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
#include <stdio.h>
#include <stdlib.h>
#include <list>

typedef struct Ple
{
	int x1,x2,y1,y2;
} Ple;

std::list<Ple> plemiona;
std::list<Ple> panstwa;
Ple* pan[100000];

int n;

int cmp(const void *a, const void *b)
{
	Ple *p=*(Ple **)a,*q=*(Ple **)b;
	if(p->x1-q->x1)return p->x1-q->x1;
	if(p->x2-q->x2)return p->x2-q->x2;
	if(p->y1-q->y1)return p->y1-q->y1;
	return p->y2-q->y2;
}

void scal(Ple *a,Ple *b)
{
	a->x1=a->x1<b->x1?a->x1:b->x1;
	a->x2=a->x2<b->x2?b->x2:a->x2;
	a->y1=a->y1<b->y1?a->y1:b->y1;
	a->y2=a->y2<b->y2?b->y2:a->y2;
}

int zawiera(Ple *a,Ple *b)
{
	if((a->x1<b->x1 && a->x2<b->x1) || (a->x1>b->x2 && a->x2>b->x2) || (a->x1<b->x1 && a->x2==b->x1) || (a->x1==b->x2 && a->x2>b->x2))return 0;
	if((a->y1<b->y1 && a->y2<b->y1) || (a->y1>b->y2 && a->y2>b->y2) || (a->y1<b->y1 && a->y2==b->y1) || (a->y1==b->y2 && a->y2>b->y2))return 0;
	return 1;
}

int main(void)
{
	int i=0,x1,x2,y1,y2;
	int minx=1000000,maxx=0,miny=1000000,maxy=0;
	int ile=0;
	int sc;
	int ipan=0;
	scanf("%d",&n);
	for(;i<n;++i)
	{
		Ple p;
		scanf("%d %d %d %d",&p.x1,&p.x2,&p.y1,&p.y2);
		if(p.x2>maxx)maxx=p.x2;
		if(p.x1<minx)minx=p.x1;
		if(p.y2>maxy)maxy=p.y2;
		if(p.y1<miny)miny=p.y1;
		plemiona.push_back(p);
		++ile;
	}
	int roz=ile;
	int granica=ile;
	while(roz)
	{
		Ple w;
		sc=0;
		std::list<Ple>::iterator fi=plemiona.begin();
		w.x1=fi->x1;
		w.x2=fi->x2;
		w.y1=fi->y1;
		w.y2=fi->y2;
		std::list<Ple>::iterator it=plemiona.begin();
		++it;
		granica=0;
		while(granica<roz)
		{
			if(zawiera(&w,&(*it)))
			{
				scal(&w,&(*it));
				plemiona.erase(it++);
				--ile;
				sc=1;
			} else it++;
			++granica;
		}
		plemiona.erase(plemiona.begin());
		if(sc)
		{
			plemiona.push_front(w);
			roz=ile;
		}
		else 
		{
			plemiona.push_back(w);
			--roz;
		}
	}
	for (std::list<Ple>::iterator it=plemiona.begin();it!=plemiona.end(); ++it)
	{
		pan[ipan++]=&(*it);
	}
	printf("%d\n",ipan);
	qsort(pan,ipan,sizeof(Ple *),cmp);
	for(i=0;i<ipan;++i)
	{
		Ple *p=pan[i];
		printf("%d %d %d %d\n",p->x1,p->x2,p->y1,p->y2);
	}
	return 0;
}