#include <bits/stdc++.h>
using namespace std;
ifstream f("cadrane.in");
ofstream g("cadrane.out");
int n,i,nr;
map <int,int> m;
struct wow
{
int x,y;
}v[100005];
bool compare (wow a,wow b)
{
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
int arb[800005],lazy[800005];
void propag(int st,int dr,int nod)
{
if (st==dr||lazy[nod]==0)
{
return ;
}
arb[2*nod]+=lazy[nod];
arb[2*nod+1]+=lazy[nod];
lazy[2*nod]+=lazy[nod];
lazy[2*nod+1]+=lazy[nod];
lazy[nod]=0;
}
void update (int st,int dr,int nod,int ua,int ub,int val)
{
propag(st,dr,nod);
if (ua<=st&&dr<=ub)
{
arb[nod]+=val;
lazy[nod]+=val;
return;
}
int mij=(st+dr)/2;
if (ua<=mij)
{
update(st,mij,2*nod,ua,ub,val);
}
if (mij<ub)
{
update(mij+1,dr,2*nod+1,ua,ub,val);
}
arb[nod]=min(arb[2*nod],arb[2*nod+1]);
}
vector <int> fr[200005];
int maxx,maxy,j,sol;
int main()
{
f>>n;
for (i=1;i<=n;i++)
{
f>>v[i].x>>v[i].y;
m[v[i].x]=1;
m[v[i].y]=1;
}
nr=0;
for (auto ind:m)
{
nr++;
m[ind.first]=nr;
}
for (i=1;i<=n;i++)
{
v[i].x=m[v[i].x];
v[i].y=m[v[i].y];
maxy=max(maxy,v[i].y);
fr[v[i].x].push_back(i);
maxx=max(maxx,v[i].x);
}
sort (v+1,v+n+1,compare);
for (i=1;i<=n;i++)
{
update(1,maxy,1,1,v[i].y,1);
}
for (i=1;i<=maxx;i++)
{
for (j=0;j<fr[i-1].size();j++)
{
update(1,maxy,1,1,v[fr[i-1][j]].y,-1);
update(1,maxy,1,v[fr[i-1][j]].y,maxy,1);
}
sol=max(sol,arb[1]);
}
g<<sol;
return 0;
}