#include<cstdio>
#include<utility>
#include<algorithm>

using namespace std;

struct RMQ{
	int N;
	int dat[524288];
	void init(int N_){
		N=1;
		while(N<N_) N*=2;
		for(int i=1;i<=N*2-1;i++) dat[i]=-1;
	}
	void update(int i,int x){
		i+=N;
		while(i>0){
			dat[i]=max(dat[i],x);
			i/=2;
		}
	}
	int get(int i){//,i)
		int k=1,l=0,r=N;
		int res=-1;
		while(r-l>1){
			int mid=(l+r)/2;
			if(mid<i){
				res=max(res,dat[k*2]);
				k=k*2+1;
				l=mid;
			}else{
				r=mid;
				k*=2;
			}
		}
		return res;
	}
};

RMQ rmq;

int N;
int lo1[100100],lo2[100100],hi1[100100],hi2[100100];
int clo1[100100],clo2[100100];

int lo_vals[200200];

int getPos(int x){
	return lower_bound(lo_vals,lo_vals+N*2,x)-lo_vals;
}

void input(){
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		scanf("%d%d%d%d",lo1+i,lo2+i,hi1+i,hi2+i);
		lo_vals[i*2]=lo1[i];
		lo_vals[i*2+1]=lo2[i];
	}
	sort(lo_vals,lo_vals+N*2);
	for(int i=0;i<N;i++){
		clo1[i]=getPos(lo1[i]);
		clo2[i]=getPos(lo2[i]);
	}
}

typedef pair<int,int> P;
typedef pair<P,P> PP;

PP pps[200200];

int ans[100100];

int solve(){
	for(int i=0;i<N;i++){
		PP pp=PP(P(hi1[i],clo1[i]),P(i,0));
		pps[i*2]=pp;
		pp=PP(P(hi2[i],clo2[i]),P(i,1));
		pps[i*2+1]=pp;
	}
	sort(pps,pps+N*2);
	rmq.init(N*2);
	for(int i=0;i<N*2;i++){
		PP pp=pps[i];
//		printf("%d %d\n",pps[i].first.first,pps[i].first.second);
		if(pp.second.second==0){
			int pos=pp.first.second;
			int val=rmq.get(pos+1);
			int id=pp.second.first;
			ans[id]=val+1;
//			printf("pos=%d,ans=%d\n",pos,val+1);
		}else{
			int id=pp.second.first;
			int val=ans[id];
			int pos=pp.first.second;
			rmq.update(pos,val);
//			printf("upd pos=%d,val=%d\n",pos,val);
		}
	}
	int res=0;
	for(int i=0;i<N;i++) res=max(res,ans[i]+1);
	return res;
}

int main(){
	input();
	int ans=solve();
	printf("%d\n",ans);
	return 0;
}