1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #define MAXN 50010 5 typedef __int64 LL; 6 struct Line 7 { 8 int left,right,high,flag; 9 }; 10 struct node 11 { 12 int cover,len; 13 }; 14 Line p[MAXN<<3]; 15 node tree[MAXN<<5]; 16 int cnt,x[MAXN<<3]; 17 inline void Post(int x1,int y1,int x2,int y2) 18 { 19 if(x1!=x2&&y1!=y2) 20 { 21 x[cnt]=x1; 22 p[cnt].left=x1; 23 p[cnt].right=x2; 24 p[cnt].high=y1; 25 p[cnt++].flag=1; 26 x[cnt]=x2; 27 p[cnt].left=x1; 28 p[cnt].right=x2; 29 p[cnt].high=y2; 30 p[cnt++].flag=-1; 31 } 32 } 33 int cmp1(const void *a,const void *b) 34 { 35 return *(int *)a-*(int *)b; 36 } 37 int cmp2(const void *a,const void *b) 38 { 39 return (*(Line *)a).high-(*(Line *)b).high; 40 } 41 int Bin(int val,int low,int high) 42 { 43 int mid; 44 while(low<high) 45 { 46 mid=(low+high)>>1; 47 if(x[mid]==val) 48 return mid; 49 if(x[mid]<val) 50 low=mid+1; 51 else 52 high=mid; 53 } 54 } 55 void Build(int L,int R,int rt) 56 { 57 tree[rt].len=tree[rt].cover=0; 58 if(L!=R) 59 { 60 int mid=(L+R)>>1; 61 Build(L,mid,rt<<1); 62 Build(mid+1,R,rt<<1|1); 63 } 64 } 65 inline void PushUp(int L,int R,int rt) 66 { 67 if(tree[rt].cover) 68 tree[rt].len=x[R+1]-x[L]; 69 else if(L==R) 70 tree[rt].len=0; 71 else 72 tree[rt].len=tree[rt<<1].len+tree[rt<<1|1].len; 73 } 74 void Update(int st,int en,int flag,int L,int R,int rt) 75 { 76 if(st<=L&&R<=en) 77 { 78 tree[rt].cover+=flag; 79 PushUp(L,R,rt); 80 } 81 else 82 { 83 int mid=(L+R)>>1; 84 if(mid>=st) 85 Update(st,en,flag,L,mid,rt<<1); 86 if(en>mid) 87 Update(st,en,flag,mid+1,R,rt<<1|1); 88 PushUp(L,R,rt); 89 } 90 } 91 int main() 92 { 93 LL ans; 94 int i,n,m,st,en,x1,y1,x2,y2,x3,y3,x4,y4; 95 while(scanf("%d",&n),n) 96 { 97 for(cnt=i=0;i<n;i++) 98 { 99 scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); 100 Post(x1,y1,x2,y3); 101 Post(x1,y4,x2,y2); 102 Post(x1,y3,x3,y4); 103 Post(x4,y3,x2,y4); 104 } 105 qsort(x,cnt,sizeof(x[0]),cmp1); 106 qsort(p,cnt,sizeof(p[0]),cmp2); 107 for(i=m=0;i<cnt;i++) 108 { 109 if(x[i]!=x[m]) 110 x[++m]=x[i]; 111 } 112 Build(0,m,1); 113 for(ans=i=0;i<cnt-1;i++) 114 { 115 st=Bin(p[i].left,0,m+1); 116 en=Bin(p[i].right,0,m+1); 117 Update(st,en-1,p[i].flag,0,m,1); 118 ans+=(LL)(p[i+1].high-p[i].high)*tree[1].len; 119 } 120 printf("%I64d\n",ans); 121 } 122 return 0; 123 }