1 // INTERSECCIÖN DE AREAS DE RECTÄNGULOS CON SEGMENT TREES :D
19 #define REP(i, n) for(int i=0;i<int(n);i++)
20 #define FOR(i, a, b) for(int i=(a);i<int(b);i++)
21 #define RFOR(i, b, a) for(int i=(b);i>int(a);i--)
22 #define foreach(it, c) for(__typeof((c).begin()) it = (c).begin();it!=(c).end();++it)
23 #define ALL(x) (x).begin(),(x).end()
24 #define SIZE(x) (int)(x).size()
25 #define SORT(x) sort(ALL(x))
27 #define VI vector<int>
28 #define VS vector<string>
30 #define ISS istringstream
31 #define OSS ostringstream
37 node(int x
, int y
){on
=x
,area
=y
;}
42 segmentTree(int x
){off
=1;while(off
<x
)off
*=2;vec
.resize(off
*2,node(0,0));}
43 int superficie(){return vec
[1].area
;}
44 void add(int node
, int begin
, int end
, int a
, int b
){
45 if( begin
> b
|| end
< a
) return;
46 if( begin
<= a
&& b
<= end
){
48 vec
[node
].area
= b
-a
+1;
51 add(node
*2,begin
,end
,a
,(a
+b
)/2);
52 add(node
*2+1,begin
,end
,(a
+b
)/2+1,b
);
53 if(!vec
[node
].on
)vec
[node
].area
= vec
[2*node
].area
+vec
[2*node
+1].area
;
56 void take(int node
,int begin
,int end
,int a
, int b
){
57 if( begin
> b
|| end
< a
) return;
58 if( begin
<= a
&& b
<= end
){
61 if(a
!=b
)vec
[node
].area
= vec
[node
*2].area
+ vec
[node
*2+1].area
;
62 else vec
[node
].area
= 0;
65 take(node
*2,begin
,end
,a
,(a
+b
)/2);
66 take(node
*2+1,begin
,end
,(a
+b
)/2+1,b
);
67 if(!vec
[node
].on
)vec
[node
].area
= vec
[node
*2].area
+ vec
[node
*2+1].area
;
71 #define PII pair<int,int>
74 segmentTree
sTree(30001);
75 int N
;scanf("%i", &N
);
77 vector
< pair
<int,PII
> > abre
, cierra
;
80 scanf("%i %i %i %i", &x1
, &y1
, &x2
, &y2
);
82 abre
.PB(MP(x1
,MP(y1
,y2
)));
83 cierra
.PB(MP(x2
,MP(y1
,y2
)));
84 lastx
= min(x1
,min(x2
,lastx
));
86 sort(ALL(abre
)); sort(ALL(cierra
));
87 abre
.PB(MP(INT_MAX
,PII(0,0)));
92 if( abre
[ind1
].first
< cierra
[ind2
].first
){
93 res
+= sTree
.superficie() * (abre
[ind1
].first
-lastx
);
94 lastx
= abre
[ind1
].first
;
95 sTree
.add(1,abre
[ind1
].second
.first
, abre
[ind1
].second
.second
,0,sTree
.off
-1);
98 res
+= sTree
.superficie()*(cierra
[ind2
].first
-lastx
);
99 lastx
= cierra
[ind2
].first
;
100 sTree
.take(1,cierra
[ind2
].second
.first
, cierra
[ind2
].second
.second
,0,sTree
.off
-1);