#include <bits/stdc++.h>
#define maxn 200005
std::ifstream fin ("cadrane.in");
std::ofstream fout ("cadrane.out");
struct point{
int x, y;
}v[maxn];
bool sort_cond_x (point a, point b){
return a.x < b.x;
}
bool sort_cond_y (point a, point b){
return a.y < b.y;
}
int min[maxn], lazy[maxn];
int fq[maxn];
void update (int left, int right, int node, int l, int r, int val){
if (left > right or left > r or right < l)
return;
/*
if (lazy[node]){
min[node] += lazy[node];
if (left < right){
lazy[2*node+1] += lazy[node];
lazy[2*node+2] += lazy[node];
}
}
*/
if (l <= left and right <= r){
min[node] += val;
if (left < right){
lazy[2*node+1] += val;
lazy[2*node+2] += val;
}
//return;
}
if (left == right)
return;
int mid = (left + right) / 2;
update (left, mid, 2*node+1, l, r, val);
update (mid+1, right, 2*node+2, l, r, val);
min[node] = std::min (min[2*node+1], min[2*node+2]);
}
int main()
{
int n, i, j;
fin >> n;
for (i=0; i<n; i++)
fin >> v[i].x >> v[i].y;
///Normalizare x
std::sort (v, v+n, sort_cond_x);
int last = v[0].x, crt = 0;
for (i=0; i<n; i++){
if (v[i].x != last){
crt ++;
last = v[i].x;
}
v[i].x = crt;
fq[v[i].x] ++;
}
int mx = crt, val;
for (int x=0, val=0; x<=mx; x++){
if (x) fq[x] += fq[x-1];
update (0, mx, 0, x, x, n - val);
val = fq[x];
}
///Normalizare y
std::sort (v, v+n, sort_cond_y);
last = v[0].y, crt = 0;
for (i=0; i<n; i++){
if (v[i].y != last){
crt ++;
last = v[i].y;
}
v[i].y = crt;
}
int my = crt;
//for (i=0; i<n; i++)
// fout << v[i].x << ' ' << v[i].y << '\n';
for (i=0; v[i].y==0; i++)
update (0, mx, 0, v[i].x+1, mx, 1);
int score = min[0];
for (int y=0, i=0; y<=my; y++){
for (j=i; v[j].y==y; j++){
update (0, mx, 0, v[j].x+1, mx, -1);
}
for (;v[i].y == y; i++){
update (0, mx, 0, 0, v[i].x-1, -1);
update (0, mx, 0, v[i].x+1, mx, 1);
}
for (j=i; v[j].y==y+1; j++){
update (0, mx, 0, v[j].x+1, mx, 1);
}
score = std::max (score, min[0]);
}
fout << score << '\n';
return 0;
}