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
121
122
123
124
125
126
#include <cstdio>
#include <iostream>
#include <algorithm>

#define nm long long int
#define unm unsigned long long int
#define uint unsigned int
#define srt(a, b) std::sort((a), (a)+(b))

using namespace std;

struct kwadrat {
uint x1;
uint y1;

uint x2;
uint y2;
};

struct abcd {
kwadrat k;
uint prev;
uint next;
bool f;
};

vector< abcd > vec;
abcd t;
bool f=0,f2=0,f3;

uint n,n2,frst=0,noop=0,j=0,c=0;

bool col(kwadrat a, kwadrat b) {

if(a.x1 < b.x2 && a.x2 > b.x1 &&
   a.y1 < b.y2 && a.y2 > b.y1)
    return 1;
return 0;

}

void join(uint a, uint b) {

    vec[vec[b].next].prev = vec[b].prev;
    vec[vec[b].prev].next = vec[b].next;
    vec[b].f=1;
    if(b==frst)
        frst = vec[b].next;
    //printf("Connecting %u %u %u %u with %u %u %u %u\n", vec[b].k.x1, vec[b].k.x2, vec[b].k.y1, vec[b].k.y2, vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2);
    vec[a].k.x1 = min(vec[b].k.x1, min(vec[a].k.x1,min(vec[b].k.x2, vec[a].k.x2)));
    vec[a].k.y1 = min(vec[b].k.y1, min(vec[a].k.y1,min(vec[b].k.y2, vec[a].k.y2)));
    vec[a].k.x2 = max(vec[b].k.x1, max(vec[a].k.x1,max(vec[b].k.x2, vec[a].k.x2)));
    vec[a].k.y2 = max(vec[b].k.y1, max(vec[a].k.y1,max(vec[b].k.y2, vec[a].k.y2)));
    //printf("Result: %u %u %u %u\n",vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2);
    n2--;
}

nm wys(kwadrat a) {
    return abs(a.y2-a.y1);
}

nm szer(kwadrat a){
    return abs(a.x2-a.x1);
}

int main()
{
    //std::ios_base::sync_with_stdio(0);
    scanf("%u", &n);
    n2=n;
    for(uint i=0;i<n;i++) {
        scanf("%u %u %u %u", &t.k.x1, &t.k.x2, &t.k.y1, &t.k.y2);
        if(!i) {
            t.prev=0;
        } else {
            vec[i-1].next=i;
        }
        t.next = i;
        vec.push_back(t);
    }
j=frst;
    while(noop<=n2){
        f=0;
        c=vec[frst].next;
        f2=0;
        f3=0;
        while(n2>1){
         //   printf("%u %u\n", c, j);
            if(vec[j].next==j&&f3) {
                j=frst;
                f3=0;
            } else if(vec[j].next==j) {
                f3=1;
            }
            if(vec[c].next==c)
                f2=1;
            if(col(vec[c].k,vec[j].k)) {
                join(j,c);
                f=1;
              //  printf("COL\n");
            }
            c=vec[c].next;
            if(f2)
                break;
           //
        }
        if(!f)
            ++noop;
        else
            noop=0;

        j=vec[j].next;
    }
    c=frst;
    n2=0;
    for(uint i=0;i<n;i++)
        if(!vec[i].f)
            ++n2;
    printf("%u\n", n2);
    c=frst;
    for(uint i=0;i<n;i++)
        if(!vec[i].f)
            printf("%u %u %u %u\n", vec[i].k.x1, vec[i].k.x2, vec[i].k.y1, vec[i].k.y2);

    return 0;
}