#include using namespace std; unordered_map> OnVert, OnHorz; int X[500000], Y[500000]; int Count(int x, int y, unordered_map &HorzSet, unordered_map &VertSet) { int t = 0; for(auto p : HorzSet) { int val = p.first, cnt = p.second; if(VertSet.count(x - val + y)) t += cnt * VertSet[x - val + y]; if(VertSet.count(val - x + y)) t += cnt * VertSet[val - x + y]; } return t; } void Read(int &a) { char c; for(c = getchar(); !isdigit(c); c = getchar()); for(a = 0; isdigit(c); c = getchar()) a = (a << 1) + (a << 3) + c - '0'; } int main() { int n; cin >> n; for(int i = 1; i <= n; ++i) { Read(X[i]); Read(Y[i]); OnVert[X[i]][Y[i]] ++; OnHorz[Y[i]][X[i]] ++; } long long total = 0; for (int i = 1; i <= n; ++i) { int x = X[i], y = Y[i]; auto &VertSet = OnVert[x], &HorzSet = OnHorz[y]; if(VertSet.size() > HorzSet.size()) total += Count(x, y, HorzSet, VertSet); else total += Count(y, x, VertSet, HorzSet); } cout << total - 2 * n; return 0; }