rt,不知为什么只A了Sub3
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
using namespace std;
const int M=1e5;
const int N=2e5;
int f[N+5],bPos[N+5],bC[M+5],n,m,color;
vector<int>to[N+5];
struct Edge{
int l,r,c,w;
friend bool operator<(Edge A,Edge B){
return A.r<B.r;
}
}E[M+5];
struct segNode{
int ch[2];
int maxn,lz;
};
int rt[M+5],cnt;
struct segTree{
segNode tr[10*N+5];
void lazy(int i,int val){
tr[i].lz+=val;
tr[i].maxn+=val;
}
void pushdown(int i){
lazy(lc,tr[i].lz);
lazy(rc,tr[i].lz);
tr[i].lz=0;
}
void pushup(int i){
tr[i].maxn=max(tr[lc].maxn,tr[rc].maxn);
}
void build(int &i,int l,int r,int x,int val){
if(!i){
i=++cnt;
}
if(l==r){
tr[i].maxn=val;
return;
}
pushdown(i);
if(x<=mid){
build(lc,l,mid,x,val);
}else{
build(rc,mid+1,r,x,val);
}
pushup(i);
}
void update(int i,int l,int r,int L,int R,int val){
if(!i){
return;
}
if(L<=l&&R>=r){
return lazy(i,val);
}
pushdown(i);
if(L<=mid){
update(lc,l,mid,L,R,val);
}
if(R>mid){
update(rc,mid+1,r,L,R,val);
}
pushup(i);
}
int query(int i){
return tr[i].maxn;
}
}seg;
int main(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&E[i].l,&E[i].r,&E[i].c,&E[i].w);
bPos[++n]=E[i].l;
bPos[++n]=E[i].r+1;
bC[++color]=E[i].c;
}
n++;
sort(bPos+1,bPos+n+1);
n=unique(bPos+1,bPos+n+1)-bPos-1;
sort(bC+1,bC+color+1);
color=unique(bC+1,bC+color+1)-bC-1;
for(int i=1;i<=m;i++){
E[i].l=lower_bound(bPos+1,bPos+n+1,E[i].l)-bPos;
E[i].r=lower_bound(bPos+1,bPos+n+1,E[i].r+1)-bPos-1;
E[i].c=lower_bound(bC+1,bC+color+1,E[i].c)-bC;
to[E[i].l-1].push_back(E[i].c);
}
sort(E+1,E+m+1);
int p=0;
for(int i=1;i<n;i++){
while(p<m&&E[p+1].r==i){
++p;
int l=E[p].l,r=E[p].r,c=E[p].c,w=E[p].w;
seg.update(rt[c],1,n,1,l-1,w);
f[i]=max(f[i],seg.query(rt[c]));
}
f[i]=max(f[i],f[i-1]);
for(int j=0;j<to[i].size();j++){
int x=to[i][j];
seg.build(rt[x],1,n,i,f[i]);
}
}
printf("%d\n",f[n-1]);
return 0;
}