#include <bits/stdc++.h>
#define int long long
#define F first
#define S second
#define pb push_back
using namespace std;
using pr = pair<int, int>;
// seggy, range query point update + diff array
const int MXN = (1 << 26) - 1;
struct Node {
Node *l = nullptr, *r = nullptr;
int val = 0;
};
void pull(Node *u) {
if(u->l == nullptr) u->l = new Node;
if(u->r == nullptr) u->r = new Node;
}
int query(Node *u, int l, int r, int lh, int rh) {
pull(u);
if(lh >= l and r >= rh) return u->val;
if(rh < l or r < lh) return 0;
int m = (lh + rh)/2;
return query(u->l, l, r, lh, m) + query(u->r, l, r, m+1, rh);
}
void update(Node *u, int i, int x, int lh, int rh) {
pull(u);
if(lh == rh) {
u->val = x;
return;
}
int m = (lh+rh)/2;
if(i <= m) update(u->l, i, x, lh, m);
else update(u->r, i, x, m+1, rh);
u->val = u->l->val + u->r->val;
}
Node *root = new Node;
// adds k to [l, r]
void updater(int l, int r, int k) {
update(root, l, k, 0, MXN);
update(root, r+1, -k, 0, MXN);
}
void updatep(int i, int k) {
update(root, i, k, 0, MXN);
}
int queryr(int l, int r) {
return query(root, l, r, 0, MXN);
}
void solve() {
int n; cin >> n;
vector<pr> gg(n);
for(int i = 0 ; i < n ; i++) {
cin >> gg[i].F >> gg[i].S;
}
// SORT BY H - K AND EITHER SET TO TOP OR DOWN
vector<pair<pr, int>> hehe(n);
for(int i = 0 ; i < n ; i++) {
hehe[i].F = gg[i];
hehe[i].S = i;
}
int mx = 0;
for(int i = 0 ; i < n ; i++) {
mx = max(mx, gg[i].S);
}
vector<int> prf(mx+1, 0);
sort(gg.begin(), gg.end(), [](pr a, pr b) {
return a.S > b.S;
});
// started from the bottom
for(int i = 0 ; i < n ; i++) {
prf[0]++;
prf[gg[i].S]--;
}
for(int i = 1 ; i <= mx ; i++) prf[i] += prf[i-1];
int s = 0;
for(int i = 0 ; i <= mx ; i++) {
updatep(i, prf[i]-1);
// cout << i << " " << prf[i] << endl;
s += prf[i]*(prf[i]-1)/2;
}
// cout << "G" << queryr(0, mx) << endl;
int ares = s;
// cout << ares << endl;
for(int i = 0 ; i <= gg[i].S ; i++) {
// cout << "M" << queryr(i,i) << endl;
}
for(int i = 0 ; i < n ; i++) {
// cout << "K" << i << " " << gg[i].F << " " << gg[i].S << endl;
int a = queryr(0, gg[i].S);
s -= a;
updater(0, gg[i].S-1, -1);
updater(gg[i].F-gg[i].S, gg[i].F-1, 1);
int b = queryr(gg[i].F-gg[i].S, gg[i].F-1);
// cout << i << " " << a << " " << b << endl;
s += b;
ares = min(ares, s);
}
cout << ares << endl;
}
signed main() {
int t = 1; // cin >> t;
while(t--) solve();
}