#include <bits/stdc++.h>
using namespace std;
struct point{
int x, y;
}v[100005];
int aint[400005], id[400005], lazy[400005];
void push(int i, int l, int r){
if(lazy[i] == 0) return;
aint[i] += lazy[i];
if(l != r){
lazy[2 * i] += lazy[i];
lazy[2 * i + 1] += lazy[i];
}
lazy[i] = 0;
}
void build(int i, int l, int r){
if(l == r) {
id[i] = l;
return;
}
int mid = l + r >> 1;
build(2 * i, l, mid);
build(2 * i + 1, mid + 1, r);
}
void update(int i, int l, int r, int ql, int qr, int val){
push(i, l, r);
if(l > qr || ql > r) return;
if(ql <= l && r <= qr){
lazy[i] += val;
push(i, l, r);
return;
}
int mid = l + r >> 1;
update(2 * i, l, mid, ql, qr, val);
update(2 * i + 1, mid + 1, r, ql, qr, val);
if(aint[2 * i] > aint[2 * i + 1]){
id[i] = id[2 * i];
aint[i] = aint[2 * i];
}
else{
id[i] = id[2 * i + 1];
aint[i] = aint[2 * i + 1];
}
}
int aux[100005], nm[100005], fr[100005];
vector<int> coord[100005];
int main(){
ifstream cin("cadrane.in");
ofstream cout("cadrane.out");
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> v[i].x >> v[i].y;
aux[i] = v[i].x;
}
sort(aux + 1, aux + n + 1);
for(int i = 1; i <= n; i++){
if(aux[i] == aux[i - 1] && i > 1) nm[i] = nm[i - 1];
else
nm[i] = nm[i - 1] + 1;
}
for(int i = 1; i <= n; i++){
v[i].x = lower_bound(aux + 1, aux + n + 1, v[i].x) - aux;
v[i].x = nm[v[i].x];
}
int nx = nm[n];
for(int i = 1; i <= n; i++){
aux[i] = v[i].y;
}
sort(aux + 1, aux + n + 1);
for(int i = 1; i <= n; i++){
if(aux[i] == aux[i - 1] && i > 1) nm[i] = nm[i - 1];
else
nm[i] = nm[i - 1] + 1;
}
int ny = nm[n];
build(1, 1, ny);
for(int i = 1; i <= n; i++){
v[i].y = lower_bound(aux + 1, aux + n + 1, v[i].y) - aux;
v[i].y = nm[v[i].y];
update(1, 1, ny, v[i].y, ny, 1);
update(1, 1, ny, 1, v[i].y, -1);
coord[v[i].x].push_back(v[i].y);
fr[v[i].y]++;
}
/*cout << nx << " " << ny << '\n';
for(int i = 1; i <= n; i++){
cout << v[i].x << " " << v[i].y << '\n';
}*/
int ans = 0;
for(int i = 1; i <= nx; i++){
for(int y : coord[i]){
//cout << y << ' ';
update(1, 1, ny, y, ny, -1);
update(1, 1, ny, 1, y, 1);
}
push(1, 1, ny);
int here = aint[1];
int pct = n + fr[id[1]];
ans = max(ans, (pct - here) / 2);
for(int y : coord[i]){
//cout << y << ' ';
update(1, 1, ny, y, ny, -1);
update(1, 1, ny, 1, y, 1);
}
//cout << '\n';
}
//n = p1 + p2
//p2 = p1 + ans
//n = 2 * p1 + ans
//p1 = (n - ans) / 2
cout << ans << '\n';
return 0;
}