代码如下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct hhh{
ll le,ri,c;
}dl[320010];
struct ggg{
ll l,r,h;
}q[40010];
ll n,p[80010];
ll ans;
bool cmp(ggg a,ggg b){
return a.h<b.h;
}
ll find(ll l,ll r,ll x){
while(l<=r){
int mid=(l+r)>>1;
if(p[mid]==x) return mid;
else if(p[mid]>x) r=mid-1;
else l=mid+1;
}
return 0;
}
void build(ll bh,ll l,ll r){
dl[bh].le=l,dl[bh].ri=r;
if(l==r-1) return;
int mid=(l+r)>>1;
build(bh*2,l,mid);
build(bh*2+1,mid,r);
}
void add(ll bh,ll l,ll r,ll x){
if(dl[bh].le>r||dl[bh].ri<l) return;
if(dl[bh].le>=l&&dl[bh].ri<=r){
dl[bh].c=x;
return;
}
int mid=(dl[bh].le+dl[bh].ri)>>1;
if(dl[bh].c){
dl[bh*2].c=x;
dl[bh*2+1].c=x;
dl[bh].c=0;
}
if(mid>=r) add(bh*2,l,r,x);
else if(mid<=l) add(bh*2+1,l,r,x);
else{
add(bh*2,l,r,x);
add(bh*2+1,l,r,x);
}
}
void ask(ll bh){
if(dl[bh].c){
ans+=(p[dl[bh].ri]-p[dl[bh].le])*dl[bh].c;
return;
}
if(dl[bh].le==dl[bh].ri-1) return;
ask(bh*2);
ask(bh*2+1);
}
int main(){
//freopen("e.in","r",stdin);
//freopen("e.out","w",stdout);
cin>>n;
int tot=0;
for(int i=1;i<=n;i++){
cin>>q[i].l>>q[i].r>>q[i].h;
p[++tot]=q[i].l,p[++tot]=q[i].r;
}
sort(q+1,q+n+1,cmp);
sort(p+1,p+2*n+1);
build(1,1,2*n);
for(int i=1;i<=n;i++){
int ql=find(1,2*n,q[i].l),qr=find(1,2*n,q[i].r);
add(1,ql,qr,q[i].h);
}
ask(1);
cout<<ans;
return 0;
}