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
#include <stdio.h>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;

typedef pair<pair<int,int>,pair<int,int>> prostokat;

#define X1 first.first
#define Y1 first.second
#define X2 second.first
#define Y2 second.second

int n;

prostokat wczytaj()
{
  prostokat a;
  scanf("%d%d%d%d",&a.X1,&a.X2,&a.Y1,&a.Y2);
  return a;
}

prostokat nowy(int x1,int x2,int y1,int y2)
{
  prostokat a;
  a.X1 = x1;
  a.X2=x2;
  a.Y1 = y1;
  a.Y2=y2;
  return a;
}

multiset<prostokat> z;
void wypisz(prostokat a);

bool przerwax(prostokat a, prostokat b)
{
  return b.X1 >= a.X2 || b.X2<=a.X1;
}

bool przerway(prostokat a, prostokat b)
{
  return b.Y1 >= a.Y2 || b.Y2<=a.Y1;
}
bool przecina(prostokat a, prostokat b)
{
//  printf("przecina\n");
//  printf("   ");wypisz(a);
//  printf("   ");wypisz(b);
  bool r = !(przerwax(a,b) || przerway(a,b));
//  printf("   %s\n",r?"TAK":"NIE");
  return r;
}

void wypisz(prostokat a)
{
  printf("%d %d %d %d\n",a.X1,a.X2,a.Y1,a.Y2);
}

void wypiszz()
{
  for(multiset<prostokat>::iterator it = z.begin();it!=z.end();++it)
  {
    wypisz(*it);
  }
}

int main()
{
  scanf("%d",&n);
  for(int i=0;i<n;i++)
  {
    prostokat a = wczytaj();
    z.insert(a);
  }
  bool flag = false;
  while (!flag)
  {
    flag = true; 
    bool find = false;
    for(multiset<prostokat>::iterator it = z.begin();it!=z.end()&&!find;++it)
    {
      for(multiset<prostokat>::iterator it2=it;it2!=z.end()&&!find;++it2)
      {
        if(it!=it2 && przecina(*it,*it2))
        {
          find = true;
          flag = false;
          prostokat a = *it;
          prostokat b = *it2;
//          wypiszz();
            z.erase(a);
            z.erase(b);
//          wypiszz();
            z.insert(nowy(min(a.X1,b.X1),max(a.X2,b.X2),min(a.Y1,b.Y1),max(a.Y2,b.Y2)));
//          wypiszz();
        }
      }
    }
  }
  printf("%d\n",z.size());
  
  wypiszz();
  
  return 0;
}