# tioj 1224 矩形覆蓋面積計算
https://tioj.ck.tp.edu.tw/problems/1224
* https://robert1003.github.io/2020/02/10/sweep-line-and-segment-tree.html
* 線段樹部份,用懶標來標示這個區間是否我0,如果懶標>0,帶標這個區間全部被加過一遍,也就沒有0,所以對應的線段樹節點值就是r-l。(懶標不要下推)
* 各節點區間的mid要重疊,否則mid到mid+1的長度會算不到
```cpp=
#include <bits/stdc++.h>
#define EB emplace_back
#define vci vector<int>
#define PII pair<int,int>
#define F first
#define S second
#define rep(X, a,b) for(int X=a;X<b;++X)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) (int)(a).size()
#define NL "\n"
#define LL long long
using namespace std;
const int N=1e6+10;
int tree[4*N]={0}, tag[4*N]={0};
void pull(int v, int l, int r){
if(tag[v]) tree[v]=r-l;
else if(r!=l) tree[v]=tree[2*v]+tree[2*v+1];
}
void modify(int v, int l, int r, int ul, int ur, int x){
if(l==ul && r==ur){
tag[v]+=x;
}
else{
int mid=(l+r)>>1;
if(ur<=mid) modify(2*v, l, mid, ul, ur, x);
else if(ul>=mid) modify(2*v+1, mid, r, ul, ur, x);
else{
modify(2*v, l, mid, ul, mid, x);
modify(2*v+1, mid, r, mid, ur, x);
}
}
pull(v, l, r);
}
struct rec{
int l, r, y, v;
bool operator<(const rec& cmp) const{
return y<cmp.y;
}
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, l, r, d, u;
cin>>n;
vector<rec> gh;
rep(i,0,n){
cin>>l>>r>>d>>u;
gh.push_back({l,r,d,1});
gh.push_back({l,r,u,-1});
}
sort(ALL(gh)); // sort by button position
LL ans=0, prevy=0;
for(auto tmp:gh){
if(tmp.y!=prevy){
ans+=tree[1]*(tmp.y-prevy); // tree[1] is the sum of non-zero in the line
prevy=tmp.y;
}
modify(1, 0, 1000000, tmp.l, tmp.r, tmp.v);
}
cout<<ans<<NL;
}
```