
#include <bits/stdc++.h>
#define M 500000
using namespace std;
int n;
int lvl,sz,from_idx,ans;
int trace[M+5],path[M+5];
struct T{
int idx,l,r,v;
}A[M+5];
vector <pair<int,int> > tree;
bool sf1(T a, T b){
if(a.r==b.r){
if(a.l==b.l) return a.idx<b.idx;
return a.l>b.l;
}
return a.r<b.r;
}
bool sf2(T a, T b){
if(a.l==b.l){
if(a.r==b.r) return a.idx<b.idx;
return a.r>b.r;
}
return a.l<b.l;
}
void input(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>A[i].idx>>A[i].l>>A[i].r;
}
sort(A+1,A+n+1,sf1);
A[1].v=1;
for(int i=1;i<n;i++){
/*if(A[i].v==A[i+1].v) A[i+1].v=A[i].v;
else A[i+1].v=A[i].v+1;*/
A[i+1].v=A[i].v+1;
}
sort(A+1,A+n+1,sf2);
}
int s_t(int l, int r, int &from){
int _max=0;
while(l<=r){
if(l%2==1){
if(tree[l].first>_max){
_max=tree[l].first;
from=tree[l].second;
}
//_max=max(tree[l].first,_max);
l++;
}
l/=2;
if(r&2==0){
// _max=max(tree[r].first,_max);
if(tree[r].first>_max){
_max=tree[r].first;
from=tree[r].second;
}
r--;
}
r/=2;
}
return _max;
}
void get(){
lvl=1;
int from;
while(lvl<n){
lvl*=2;
}
sz=lvl+n-1;
for(int i=0;i<=sz;i++){
tree.push_back({0,0});
}
int idx,cnt;
for(int i=1;i<=n;i++){
idx=lvl+A[i].v-1;
cnt=s_t(idx,sz,from)+1;
if(cnt==1) from = -1;
trace[i]=from;
if(cnt>ans){
from_idx=i;
ans=cnt;
}
//ans=max(cnt,ans);
while(idx){
if(cnt>tree[idx].first){
tree[idx]={cnt,i};
}
//tree[idx].first=max(cnt,tree[idx].first);
idx/=2;
}
/*for(int j=1;j<=sz;j++){
cout<<tree[j].first<<" ";
if((j&(j+1))==0) cout<<endl;
}
cout<<endl;*/
}
}
int main(){
//freopen("in.txt","r",stdin);
cin.tie(0);
ios::sync_with_stdio(false);
input();
get();
cout<<ans<<endl;
/*int k=0;
while(from_idx!=-1){
path[k++]=A[from_idx].idx;
from_idx=trace[from_idx];
}
for(int i=k-1;i>=0;i--){
cout<<path[i]<<endl;
}*/
return 0;
}
Comments
Post a Comment