#include #include #include #include #include #define x first #define y second const int mod = 666013; using namespace std; pair S[100010]; vector < pair > H[mod]; inline bool comp(pair A, pair B) { return A.x + A.y < B.x + B.y; } int f(pair X) { unsigned int val = ((unsigned)X.x * 71 + (unsigned)X.y * 73); return val % mod; } bool is(pair X) { vector > :: iterator it; int go = f(X); for (it = H[go].begin(); it != H[go].end(); ++it) if (X == *it) return 1; return 0; } void add(pair X) { int go = f(X); H[go].push_back(X); } int computeHalf(int N) { for (int i = 1; i <= N; ++i) add(S[i]); sort(S + 1, S + N + 1, comp); int le = 1, lim = sqrt(N); int res = 0; for (int i = 1; i <= N; ++i) if (S[i].x + S[i].y == S[i + 1].x + S[i + 1].y) ++le; else { if (le >= lim) { int sum = S[i].x + S[i].y; for (int j = 1; j <= N; ++j) { int d = sum - S[j].x - S[j].y; if (is(make_pair(S[j].x + d, S[j].y)) && is(make_pair(S[j].x, S[j].y + d))) res += (d != 0); } } else { int last = i - le + 1; for (int j = last; j < i; ++j) for (int k = j + 1; k <= i; ++k) { pair xx, yy; xx = S[j]; yy = S[k]; if (xx.x > yy.x) swap(xx, yy); if (is(make_pair(xx.x, yy.y))) ++res; if (is(make_pair(yy.x, xx.y))) ++res; } } le = 1; } for (int i = 0; i < mod; ++i) H[i].clear(); return res; } int main() { int N; scanf("%d", &N); for (int i = 1; i <= N; ++i) scanf("%d%d", &S[i].x, &S[i].y); int res = computeHalf(N); for (int i = 1; i <= N; ++i) { complex px(S[i].x, S[i].y), py(0, 1), pz = px * py; S[i] = make_pair(pz.real(), pz.imag()); } res += computeHalf(N); printf("%d", res); return 0; }