#include #include #include #include #include using namespace std; ifstream in("special_triangles.in"); ofstream out("special_triangles.out"); const int Sqr = 315; const int MOD = 31547; const int CRD = 1000000005; struct punct { int x; int y; }; bool cmp (punct A, punct B) { return A.x + A.y < B.x + B.y; } int Hash (int x, int y, vector >&H) { int rez = 0; for (int i = 0; i < H[x].size(); i++) if (H[x][i] == y) rez++; return rez; } int solve_diag(vector&A, vector&v, vector >&H) { int rez = 0; for (int i = 0; i < A.size() - 1; i++) for (int j = i + 1; j < A.size(); j++) rez = rez + Hash((min(v[A[i]].x, v[A[j]].x)) % MOD, min(v[A[i]].y, v[A[j]].y), H) + Hash((max(v[A[i]].x, v[A[j]].x)) % MOD, max(v[A[i]].y, v[A[j]].y), H); return rez; } int solve_mult(int&S, vector&v, vector >&H) { int rez = 0; for (int i = 0; i < v.size(); i++) if (Hash((S - v[i].y) % MOD, v[i].y, H) > 0 && Hash(v[i].x % MOD, S - v[i].x, H) > 0) rez++; return rez; } int solve(vector&v, vector >&H) { int rez = 0; int S = v[0].x + v[0].y; vector A; A.push_back(0); v.push_back({0, 0}); int Size = v.size(); for (int i = 1; i < Size; i++) { if (S == v[i].x + v[i].y && i != Size - 1) A.push_back(i); else { if (A.size() <= Sqr) rez = rez + solve_diag(A, v, H); else rez = rez + solve_mult(S, v, H); S = v[i].x + v[i].y; A.clear(); A.push_back(i); } } v.pop_back(); return rez; } int main() { int n, rez, maxim_x = 0; cin >> n; vector v; vector > H(MOD, vector()); vector > W(MOD, vector()); for (int i = 1; i <= n; i++) { int x, y; cin >> x >> y; x = x + CRD; y = y + CRD; maxim_x = max(maxim_x, x); v.push_back({x, y}); H[x % MOD].push_back(y); } sort(v.begin(), v.end(), cmp); rez = solve(v, H); for (int i = 0; i < v.size(); i++) { int aux = v[i].x; v[i].x = v[i].y; v[i].y = maxim_x - aux; W[v[i].x % MOD].push_back(v[i].y); } sort(v.begin(), v.end(), cmp); cout << rez + solve(v, W); return 0; }