#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define DB double
#define SG string
#define LL long long
#define Fp(A,B,C,D) for(A=B;A<=C;A+=D)
#define Fm(A,B,C,D) for(A=B;A>=C;A-=D)
#define Clear(A) memset(A,0,sizeof(A))
#define Copy(A,B) memcpy(A,B,sizeof(B))
using namespace std;
const LL Max=1e7+5;
const LL Inf=1e9;
LL N,Cnt=1,LSon[Max],RSon[Max],Lazy[Max];
inline LL Read(){
LL X=0;char CH=getchar();bool F=0;
while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
return F?-X:X;
}
inline void Write(LL X){
if(X<0)X=-X,putchar('-');
if(X>9)Write(X/10);
putchar(X%10+48);
}
void LAZY(LL P){
if(LSon[P]){
Lazy[LSon[P]]=max(Lazy[LSon[P]],Lazy[P]);
}
if(RSon[P]){
Lazy[RSon[P]]=max(Lazy[RSon[P]],Lazy[P]);
}
}
void Update(LL P,LL L,LL R,LL X,LL Y,LL Z){
if(X<=L&&R<=Y){
Lazy[P]=max(Lazy[P],Z);
return;
}
LL Mid=L+R>>1;
if(X<=Mid){
if(!LSon[P]){
LSon[P]=++Cnt;
}Update(LSon[P],L,Mid,X,Y,Z);
}
if(Mid<Y){
if(!RSon[P]){
RSon[P]=++Cnt;
}Update(RSon[P],Mid+1,R,X,Y,Z);
}
}
LL GetSum(LL P,LL L,LL R){
if(Lazy[P]){
LAZY(P);
}
if(L==R){
return Lazy[P];
}LL Sum=0,Mid=L+R>>1;
if(LSon[P]){
Sum+=GetSum(LSon[P],L,Mid);
} else {
Sum+=Lazy[P]*(Mid-L+1);
}
if(RSon[P]){
Sum+=GetSum(RSon[P],Mid+1,R);
} else {
Sum+=Lazy[P]*(R-Mid);
}
return Sum;
}
int main(){
LL I,J,K;
N=Read();
Fp(I,1,N,1){
LL X=Read(),Y=Read(),Z=Read();
Update(1,1,Inf,X,Y-1,Z);
}
Write(GetSum(1,1,Inf));
return 0;
}
BZOJ P4636 蒟蒻的数列【线段树动态开点模板】
猜你喜欢
转载自blog.csdn.net/yanzhenhuai/article/details/80669814
今日推荐
周排行