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

class Rect{
public:
    int x1,x2,y1,y2;
};

bool s(Rect l , Rect p){
    if(l.x1<p.x1)
        return true;
    if(l.x1>p.x1)
        return false;
    if(l.x2<p.x2)
        return true;
    if(l.x2>p.x2)
        return false;
    if(l.y1<p.y1)
        return true;
    if(l.y1>p.y1)
        return false;
    if(l.y2<p.y2)
        return true;
    return false;
}

int main(){
    int n;
    cin >> n;
    vector <Rect> v(n);
    for(int i=0 ;i<n ; i++)
        cin >> v[i].x1 >> v[i].x2 >> v[i].y1 >> v[i].y2;

    int i=0;
    while(i<v.size()){
        for(int j=0 ; j<v.size() ; j++){
            if(j==i)
                continue;
            if((v[j].x2 > v[i].x1 && v[j].x1 < v[i].x2 && v[j].y2 > v[i].y1 && v[j].y1 <v[i].y2) || (v[j].x1 == v[i].x1 && v[j].x2 == v[i].x2 && v[j].y1 == v[i].y1 && v[j].y2 == v[i].y2)){
                int mniejszy = min(i , j);
                v[mniejszy].x1 = min(v[i].x1 , v[j].x1);
                v[mniejszy].x2 = max(v[i].x2 , v[j].x2);
                v[mniejszy].y1 = min(v[i].y1 , v[j].y1);
                v[mniejszy].y2 = max(v[i].y2 , v[j].y2);

                v[max(i,j)] = v.back();
                v.pop_back();
                i = mniejszy -1;
                break;
            }
        }
        i++;
    }
    sort(v.begin() , v.end() , s);
    cout << v.size() << endl;
    for(int i=0 ; i<v.size() ; i++){
        cout << v[i].x1 << " " << v[i].x2 << " " << v[i].y1 << " " << v[i].y2 << endl;
    }
}