#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
#define Shahriyor ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define vc vector<char>
#define vs vector<string>
#define vp vector<pair<int,int>>
#define vvp vector<vector<pair<int,int>>>
#define all(x) (x).begin(), (x).end()
#define allr(x) x.rbegin(), x.rend()
#define sz(x) (int)x.size()
#define endl '\n'
#define len(a) (int)(a).length()
#define inf 4e18
#define print(x) { cout << x << endl; return; }
void Solve();
int mod = 1e9+7;
int LOG = 20;
vi dx = {-1, 1, 0, 0, 1, -1, 1, -1};
vi dy = {0, 0, 1, -1, 1, -1, -1, 1};
ostream& operator<<(ostream& out, vi& a) {
for(int i=0;i<sz(a);i++) out << a[i] << ' ';
return out;
}
istream& operator>>(istream& in, vi& a) {
for(int i=0;i<sz(a);i++) in >> a[i];
return in;
}
int sum(vi& l) {return accumulate(all(l),(int)0);}
int binpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
signed main(){
clock_t start = clock();
Shahriyor;
int t = 1;
// cin >> t;
while(t--) Solve();
// cerr << "Time: " << double(clock() - start) / double(CLOCKS_PER_SEC) * 1000 << " ms\n";
}
void Solve(){
int n; cin>>n;
vp l;
vi cnt(2*n+1,0);
map<int,int> mp;
for(int i=0;i<n;i++){
int a,b; cin>>a>>b;
l.push_back({a,b});
cnt[(a+b)%(2*n)]++;
mp[a]=mp[b]=i;
}
int mx=0,target=1;
for(int i=1;i<2*n;i++) if(i!=n && cnt[i]>mx) target=i,mx=cnt[i];
cout << n-mx << endl;
// vi vis(2*n+1,0);
// for(int i=0;i<n;i++) if((l[i].first+l[i].second)%(2*n)==target) vis[l[i].first]=vis[l[i].second]=1;
// vector<array<int,3>> v;
// for(int i=0;i<2*n;i++){
// if(vis[i]) continue;
// int a=l[mp[i]].first,b=l[mp[i]].second;
// int odd=(a == i ? b : a);
// vis[i]=1;
// vis[(target-i+2*n)%(2*n)]=1;
// v.push_back({mp[i],odd,(target-i+2*n)%(2*n)});
// if(l[mp[i]].first==odd) l[mp[i]].first=(target-i+2*n)%(2*n);
// else l[mp[i]].second=(target-i+2*n)%(2*n);
// }
// for(auto i:v) cout << i[0] << " " << i[1] << " " << i[2] << endl;
}
// Code once, never "guess", have clear plan.