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

#define MAX_N 100000

struct Rect
{
    int x1,x2,y1,y2;
    inline friend bool collision(Rect r1,Rect r2)
    {
        return r2.x2>r1.x1 && r1.x2>r2.x1 && r2.y2>r1.y1 && r1.y2>r2.y1;
    }
    inline friend Rect merge(Rect r1,Rect r2)
    {
        Rect ret;
        ret.x1=min(r1.x1,r2.x1);
        ret.x2=max(r1.x2,r2.x2);
        ret.y1=min(r1.y1,r2.y1);
        ret.y2=max(r1.y2,r2.y2);
        return ret;
    }
    inline bool operator < (const Rect r) const
    {
        return (x1==r.x1?(x2==r.x2?(y1==r.y1?y2<r.y2:y1<r.y1):x2<r.x2):x1<r.x1);
    }
};

int n;
Rect R[MAX_N];

int main()
{
    scanf("%d",&n);
    for(int a=0;a<n;++a)
    {
        scanf("%d%d%d%d",&R[a].x1,&R[a].x2,&R[a].y1,&R[a].y2);
    }
    for(int p=0;p<n;++p)
    {
        START:
        if(R[p].x1!=-1)
        {
            for(int a=0;a<p;++a)
            {
                if(R[a].x1!=-1 && collision(R[p],R[a]))
                {
                    R[p]=merge(R[p],R[a]);
                    R[a].x1=-1;
                    goto START;
                }
            }
        }
    }

    sort(R,R+n);
    int size=0;
    for(int p=0;p<n;++p)
    {
        if(R[p].x1==-1)size++;
        else break;
    }
    printf("%d\n",n-size);
    for(int p=size;p<n;++p)
    {
        printf("%d %d %d %d\n",R[p].x1,R[p].x2,R[p].y1,R[p].y2);
    }
    return 0;
}