#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pb push_back
#define ff first
#define ss second
const int N = 1e5 + 1;
const int b = 320;
struct haszownik{
ll operator()(pii p) const noexcept{
ll x = p.first, y = p.second;
return (x << 32) | y;
}
};
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
unordered_map<int, unordered_map<int, int>> wiersze;
unordered_map<int, int> ile;
unordered_map<pii, ll, haszownik> pary;
vi ciezkie, lekkie;
for(int i = 1; i <= n; i++){
int x, y; cin >> x >> y;
wiersze[x][y]++;
ile[x]++;
}
for(auto& pk : ile){
if(pk.ss >= b) ciezkie.pb(pk.ff);
else lekkie.pb(pk.ff);
}
ll wyn = 0;
int m = ciezkie.size();
for(int i = 0; i < m; i++){
for(int j = i + 1; j < m; j++){
int x1 = ciezkie[i], x2 = ciezkie[j];
if(ile[x1] > ile[x2]) swap(x1, x2);
ll cnt = 0;
for(auto& t : wiersze[x1]){
int y = t.ff;
if(wiersze[x2].find(y) != wiersze[x2].end()) cnt++;
}
wyn += (cnt - 1) * cnt / 2;
}
}
int k = lekkie.size();
for(int i = 0; i < m; i++){
for(int j = 0; j < k; j++){
int x1 = lekkie[j], x2 = ciezkie[i];
ll cnt = 0;
for(auto& t : wiersze[x1]){
int y = t.ff;
if(wiersze[x2].find(y) != wiersze[x2].end()) cnt++;
}
wyn += (cnt - 1) * cnt / 2;
}
}
for(int i = 0; i < k; i++){
int x = lekkie[i];
vi elem;
for(auto& t : wiersze[x]) elem.pb(t.ff);
int z = elem.size();
for(int j = 0; j < z; j++){
for(int l = j + 1; l < z; l++){
int y1 = elem[j], y2 = elem[l];
if(y1 > y2) swap(y1, y2);
wyn += pary[make_pair(y1, y2)];
pary[make_pair(y1, y2)]++;
}
}
}
cout << wyn << "\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKCmNvbnN0IGludCBOID0gMWU1ICsgMTsKY29uc3QgaW50IGIgPSAzMjA7CgpzdHJ1Y3QgaGFzem93bmlrewogICAgbGwgb3BlcmF0b3IoKShwaWkgcCkgY29uc3Qgbm9leGNlcHR7CiAgICAgICAgbGwgeCA9IHAuZmlyc3QsIHkgPSBwLnNlY29uZDsKCiAgICAgICAgcmV0dXJuICh4IDw8IDMyKSB8IHk7CiAgICB9Cn07CgoKaW50IG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKICAgIGludCBuOwogICAgY2luID4+IG47CgogICAgdW5vcmRlcmVkX21hcDxpbnQsIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+PiB3aWVyc3plOwogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gaWxlOwogICAgdW5vcmRlcmVkX21hcDxwaWksIGxsLCBoYXN6b3duaWs+IHBhcnk7CiAgICB2aSBjaWV6a2llLCBsZWtraWU7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgaW50IHgsIHk7IGNpbiA+PiB4ID4+IHk7CiAgICAgICAgd2llcnN6ZVt4XVt5XSsrOwogICAgICAgIGlsZVt4XSsrOwogICAgfQoKICAgIGZvcihhdXRvJiBwayA6IGlsZSl7CiAgICAgICAgaWYocGsuc3MgPj0gYikgY2llemtpZS5wYihway5mZik7CiAgICAgICAgZWxzZSBsZWtraWUucGIocGsuZmYpOwogICAgfQoKCiAgICBsbCB3eW4gPSAwOwoKICAgIGludCBtID0gY2llemtpZS5zaXplKCk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbTsgaSsrKXsKICAgICAgICBmb3IoaW50IGogPSBpICsgMTsgaiA8IG07IGorKyl7CiAgICAgICAgICAgIGludCB4MSA9IGNpZXpraWVbaV0sIHgyID0gY2llemtpZVtqXTsKICAgICAgICAgICAgaWYoaWxlW3gxXSA+IGlsZVt4Ml0pIHN3YXAoeDEsIHgyKTsKICAgICAgICAgICAgbGwgY250ID0gMDsKICAgICAgICAgICAgZm9yKGF1dG8mIHQgOiB3aWVyc3plW3gxXSl7CiAgICAgICAgICAgICAgICBpbnQgeSA9IHQuZmY7CiAgICAgICAgICAgICAgICBpZih3aWVyc3plW3gyXS5maW5kKHkpICE9IHdpZXJzemVbeDJdLmVuZCgpKSBjbnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3eW4gKz0gKGNudCAtIDEpICogY250IC8gMjsKICAgICAgICB9CiAgICB9CiAgICBpbnQgayA9IGxla2tpZS5zaXplKCk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbTsgaSsrKXsKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgazsgaisrKXsKICAgICAgICAgICAgaW50IHgxID0gbGVra2llW2pdLCB4MiA9IGNpZXpraWVbaV07CiAgICAgICAgICAgIGxsIGNudCA9IDA7CiAgICAgICAgICAgIGZvcihhdXRvJiB0IDogd2llcnN6ZVt4MV0pewogICAgICAgICAgICAgICAgaW50IHkgPSB0LmZmOwogICAgICAgICAgICAgICAgaWYod2llcnN6ZVt4Ml0uZmluZCh5KSAhPSB3aWVyc3plW3gyXS5lbmQoKSkgY250Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd3luICs9IChjbnQgLSAxKSAqIGNudCAvIDI7CiAgICAgICAgfQogICAgfQoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBrOyBpKyspewogICAgICAgIGludCB4ID0gbGVra2llW2ldOwogICAgICAgIHZpIGVsZW07CiAgICAgICAgZm9yKGF1dG8mIHQgOiB3aWVyc3plW3hdKSBlbGVtLnBiKHQuZmYpOwogICAgICAgIGludCB6ID0gZWxlbS5zaXplKCk7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHo7IGorKyl7CiAgICAgICAgICAgIGZvcihpbnQgbCA9IGogKyAxOyBsIDwgejsgbCsrKXsKICAgICAgICAgICAgICAgIGludCB5MSA9IGVsZW1bal0sIHkyID0gZWxlbVtsXTsKICAgICAgICAgICAgICAgIGlmKHkxID4geTIpIHN3YXAoeTEsIHkyKTsKICAgICAgICAgICAgICAgIHd5biArPSBwYXJ5W21ha2VfcGFpcih5MSwgeTIpXTsKICAgICAgICAgICAgICAgIHBhcnlbbWFrZV9wYWlyKHkxLCB5MildKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKCiAgICBjb3V0IDw8IHd5biA8PCAiXG4iOwoKCgoKCiAgICByZXR1cm4gMDsKfQoK