#include #define maxN 100002 #define ll long long #define pii pair < int, int > using namespace std; //FILE *fin = freopen("spt.in", "r", stdin); //FILE *fout = freopen("spt.out", "w", stdout); /* ---------------- */ int n, m; /* ---------------- */ struct Coord { int x, y, p; } v[maxN], V[maxN]; int pos1[maxN], pos2[maxN], samex[maxN], samey[maxN], Q[maxN]; /* ---------------- */ map < pii, int > H; /* ---------------- */ ll ans; int cmpx(const Coord a, const Coord b) { if (a.x == b.x) return a.y < b.y; return a.x < b.x; } int cmpy(const Coord a, const Coord b) { if (a.y == b.y) return a.x < b.x; return a.y < b.y; } void read() { scanf("%d", &n); for (int i = 1; i <= n; ++ i) { scanf("%d %d", &v[i].x, &v[i].y); ++ H[pii{v[i].x, v[i].y}]; v[i].p = i; V[i] = v[i]; } } void get_spt() { int p = 1, q = 1; for (int i = 1; i <= n; ++ i) { if (V[i].y != V[q].y) q = i; Q[V[i].p] = q; } for (int i = 1; i <= n; ++ i) { if (v[i].x != v[p].x) p = i; q = Q[v[i].p]; if (samex[p] < samey[q]) { for (int j = p; v[j].x == v[i].x && j <= n; ++ j) if (j != i) { //if ( H[pii{v[i].x + v[i].y - v[j].y, v[i].y}]) // printf("%d %d %d %d %d %d\n", v[i].x, v[i].y, v[j].x, v[j].y, v[i].x + v[i].y - v[j].y, v[i].y); ans += H[pii{v[i].x + v[i].y - v[j].y, v[i].y}]; if ( H[pii{v[i].x - v[i].y + v[j].y, v[i].y}]) printf("%d %d %d %d %d %d\n", v[i].x, v[i].y, v[j].x, v[j].y, v[i].x - v[i].y + v[j].y, v[i].y); ans += H[pii{v[i].x - v[i].y + v[j].y, v[i].y}]; //ans += H[pii{v[i].x + v[i].y - v[j].y, v[j].y}]; //ans += H[pii{v[i].x - v[i].y + v[j].y, v[j].y}]; } } else for (int j = q; V[j].y == V[pos2[v[i].p]].y && j <= n; ++ j) if (j != pos2[v[i].p]) { //if (H[pii{V[pos2[v[i].p]].x, V[pos2[v[i].p]].y + V[pos2[v[i].p]].x - V[j].x}]) // printf("%d %d %d %d %d %d\n", V[pos2[v[i].p]].x, V[pos2[v[i].p]].y, V[j].x, V[j].y, V[pos2[v[i].p]].x, V[pos2[v[i].p]].y + V[pos2[v[i].p]].x - V[j].x); ans += H[pii{V[pos2[v[i].p]].x, V[pos2[v[i].p]].y + V[pos2[v[i].p]].x - V[j].x}]; //if (H[pii{V[pos2[v[i].p]].x, V[pos2[v[i].p]].y - V[pos2[v[i].p]].x + V[j].x}]) // printf("%d %d %d %d %d %d\n", V[pos2[v[i].p]].x, V[pos2[v[i].p]].y, V[j].x, V[j].y, V[pos2[v[i].p]].x, V[pos2[v[i].p]].y - V[pos2[v[i].p]].x + V[j].x); ans += H[pii{V[pos2[v[i].p]].x, V[pos2[v[i].p]].y - V[pos2[v[i].p]].x + V[j].x}]; //ans += H[pii{V[j].x, V[pos2[v[i].p]].y + V[pos2[v[i].p]].x - V[j].x}]; //ans += H[pii{V[j].x, V[pos2[v[i].p]].y - V[pos2[v[i].p]].x + V[j].x}]; } } } void solve() { sort(v + 1, v + n + 1, cmpx); sort(V + 1, V + n + 1, cmpy); int p = 1, q = 1; for (int i = 1; i <= n; ++ i) { if (v[i].x == v[p].x) ++ samex[p]; else { p = i; ++ samex[p]; } if (V[i].y != V[q].y) q = i; ++ samey[q]; pos1[v[i].p] = i; pos2[V[i].p] = i; } get_spt(); } void write() { printf("%lld\n", ans); } int main() { read(); solve(); write(); return 0; }