#include using namespace std; int sol, Konst, N, x[100009], y[100009]; pair < int, int > h[100009]; const int hashMod = 666013; vector < pair < int, int > > hsh[hashMod]; int key (pair < int, int > v) {unsigned int val = ((unsigned)v.first * 71 + (unsigned)v.second * 73); return val % hashMod;} void Push (pair < int, int > x) {hsh[key (x)].push_back (x);} bool Qry (pair < int, int > x) {int lin = key (x); for(auto it = hsh[lin].begin (); it != hsh[lin].end (); it ++)if (*it == x) return 1; return 0;} void solve (bool type) { for (int i=1; i<=N; i++) { int j, diag = h[i].first; for (j=i; j<=N; j++) if (h[j].first != h[i].first) break; j --; /// if (j - i + 1 <= Konst) { for (int k=i; k<=j; k++) for (int p=k + 1; p<=j; p++) { int p1 = h[k].second, p2 = h[p].second; sol += Qry ({x[p1], y[p2]}), sol += Qry ({x[p2], y[p1]}); } } else { if (!type) { for (int k=1; k<=N; k++) { if (x[k] + y[k] != diag) sol += (Qry ({x[k], diag - x[k]}) & Qry ({diag - y[k], y[k]})); } } else { for (int k=1; k<=N; k++) { if (x[k] - y[k] != diag) sol += (Qry ({x[k], x[k] - diag}) & Qry ({diag + y[k], y[k]})); } } } /// i = j; } } void Read (int &x); int main () { //freopen ("input", "r", stdin); //freopen ("output", "w", stdout); Read (N); while (Konst * Konst <= N) Konst ++; for (int i=1; i<=N; i++) Read (x[i]), Read (y[i]), Push ({x[i], y[i]}), h[i] = make_pair (x[i] + y[i], i); sort (h + 1, h + N + 1), solve (0); for (int i=1; i<=N; i++) h[i] = make_pair (x[i] - y[i], i); sort (h + 1, h + N + 1), solve (1); printf ("%d\n", sol); return 0; } #define maxl 100000 int pos = maxl - 1; char sir[maxl]; void Next () { if (++pos == maxl) fread (sir, 1, maxl, stdin), pos = 0; } void Read (int &x) { while (sir[pos] < '0' || sir[pos] > '9') Next (); for (x = 0; sir[pos] >= '0' && sir[pos] <= '9'; Next ()) x = x * 10 + sir[pos] - '0'; }