Food Chain

 

#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