using namespace std; struct node { long long x,y; long long h; }a[100005]; long long tree[100005]; int n,cnt; int lowbit(int x) { return x&-x; } void update(int x,long long val) { for(int i=x;i<=cnt;i+=lowbit(i)) { tree[i]=max(tree[i],val); } } long long getsum(int x) { long long rt=0; for(int i=x;i>=1;i-=lowbit(i)) { rt=max(rt,tree[i]); } return rt; } int cmp(node a,node b) { if(a.y==b.y)return a.x>b.x; else return a.y>b.y; } long long q[100005]; long long qq[100005]; int main() { memset(tree,0,sizeof(tree)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%I64d%I64d%I64d",&a[i].x,&a[i].y,&a[i].h); q[i]=a[i].x; } sort(q+1,q+1+n); cnt=0; for(int i=1;i<=n;i++) { if(q[i]!=q[i-1])qq[++cnt]=q[i]; } //if(n==100000)printf("%d\n",cnt); sort(a+1,a+1+n,cmp); long long ans=0; for(int i=1;i<=n;i++) { a[i].x=lower_bound(qq+1,qq+1+cnt,a[i].x)-qq; a[i].y=lower_bound(qq+1,qq+1+cnt,a[i].y)-qq; } for(int i=1;i<=n;i++) { //if(n==100000)printf("i:%d\n",i); //a[i].x=lower_bound(qq+1,qq+1+cnt,a[i].x)-qq; long long temp=0; int pos=a[i].y-1;//=lower_bound(qq+1,qq+1+cnt,a[i].y)-qq-1; if(pos<=0)temp=a[i].h; else temp=getsum(pos)+a[i].h; if(ans<temp)ans=temp; update(a[i].x,temp); } //long long ans=getsum(cnt); printf("%I64d\n",ans); return 0; }
|