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
#include <cstdio>
#include <algorithm>

#define fr first
#define sc second

using namespace std;

typedef pair<pair<int,int>,pair<int,int> > quatrint;

bool intersect(int i,int j,int i1,int j1,int a,int b,int a1,int b1) {
    if (i==-1 || a==-1) return false;
    int ax,ay,bx,by;
    ax=max(i,a);
    ay=max(j,b);
    bx=min(i1,a1);
    by=min(j1,b1);
    return ax<bx && ay<by;
    // orig:
    return (\
      (((i>=a) && (i<=a1)) && ((j>=b)&&(j<=b1))) || \
      (((a>=i) && (a<=i1)) && ((b>=j)&&(b<=j1))) || \
      (((i1>=a) && (i1<=a1)) && ((j1>=b)&&(j1<=b1))) || \
      (((a1>=i) && (a1<=i1)) && ((b1>=j)&&(b1<=j1))) \
    );
}

bool isect(quatrint a, quatrint b) {
    return intersect(a.fr.fr,a.sc.fr,a.fr.sc,a.sc.sc,b.fr.fr,b.sc.fr,b.fr.sc,b.sc.sc);
    /*
    if ( true ) {
      return true;
      puts("fusion!");
    }
    return false;
    */
}

int main() {
  int n, n2, i, j;
  scanf("%d", &n);
  quatrint tab[n];
  for (i=0; i<n; i++)
    scanf("%d%d%d%d", &tab[i].fr.fr,&tab[i].fr.sc,&tab[i].sc.fr,&tab[i].sc.sc);
  n2=n;
  NotSoGood:
  for (i=0; i<n; i++) {
    for (j=i+1; j<n; j++) {
      if (isect(tab[i],tab[j])) {
	tab[i].fr.fr=min(tab[i].fr.fr,tab[j].fr.fr);
	tab[j].fr.fr=-1;
	tab[i].fr.sc=max(tab[i].fr.sc,tab[j].fr.sc);
	tab[j].fr.sc=-1;
	tab[i].sc.fr=min(tab[i].sc.fr,tab[j].sc.fr);
	tab[j].sc.fr=-1;
	tab[i].sc.sc=max(tab[i].sc.sc,tab[j].sc.sc);
	tab[j].sc.sc=-1;
	n2--;
	goto NotSoGood;
      }
    }
  }
  printf("%d\n",n2);
  sort(tab, tab+n);
  for (i=n-n2; i<n; i++)
    printf("%d %d %d %d\n",tab[i].fr.fr,tab[i].fr.sc,tab[i].sc.fr,tab[i].sc.sc);
  return 0;
}