#include <bits/stdc++.h>
#define x first
#define y second
#define left_son (node<<1)
#define right_son (node<<1|1)
#define mid ((st+dr)>>1)
using namespace std;
const int Nmax = 1e5+5;
int n, i, limX, limY, lazy[Nmax<<2], arb[Nmax<<2], ans=0;
vector<int> v[Nmax];
pair<int,int> a[Nmax];
void norm(int a[], int &lim)
{
int i; lim = 0;
pair<int,int> b[Nmax];
for(i=1; i<=n; ++i)
b[i] = {a[i],i};
sort(b+1, b+n+1);
b[0] = {INT_MAX, INT_MAX};
for(i=1; i<=n; ++i)
{
if(b[i].x!=b[i-1].x) ++lim;
a[b[i].y] = lim;
}
}
void normalize()
{
int i, b[Nmax];
for(i=1; i<=n; ++i) b[i] = a[i].x;
norm(b, limX);
for(i=1; i<=n; ++i) a[i].x = b[i];
for(i=1; i<=n; ++i) b[i] = a[i].y;
norm(b, limY);
for(i=1; i<=n; ++i) a[i].y = b[i];
for(i=1; i<=n; ++i)
v[a[i].x].push_back(a[i].y);
}
void update(int node, int st, int dr, int Left, int Right, int val)
{
if(lazy[node])
{
arb[node] += lazy[node];
lazy[left_son] += lazy[node];
lazy[right_son] += lazy[node];
lazy[node] = 0;
}
if(Left<=st && dr<=Right)
{
arb[node] += val;
lazy[left_son] += val;
lazy[right_son] += val;
return;
}
if(Left<=mid) update(left_son, st, mid, Left, Right, val);
if(mid<Right) update(right_son, mid+1, dr, Left, Right, val);
arb[node] = min(arb[left_son], arb[right_son]);
}
int query()
{
return arb[1] + lazy[1];
}
int main()
{
freopen("cadrane.in", "r", stdin);
freopen("cadrane.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; ++i) scanf("%d%d", &a[i].x, &a[i].y);
normalize();
for(i=1; i<=n; ++i)
update(1, 1, limY, 1, a[i].y, 1);
for(i=1; i<=limX; ++i)
{
for(auto it : v[i])
update(1, 1, limY, it, limY, 1);
for(auto it : v[i-1])
update(1, 1, limY, 1, it, -1);
ans = max(ans, query());
}
printf("%d\n", ans);
return 0;
}