#include #include #include #include using namespace std; #define MaxN 100100 #define MaxH (1<<22) int N; pair points[MaxN]; unordered_set pointSet; bitset preHash; int preVal(const pair p) { return ((unsigned)(p.first ^ p.second)) & (MaxH - 1); } void insertPoint(pair p) { long long val = *((long long *)&p); preHash[preVal(p)] = true; pointSet.insert(val); } bool havePoint(pair p) { if (!preHash[preVal(p)]) { return false; } long long val = *((long long *)&p); return pointSet.find(val) != pointSet.end(); } int main() { #ifdef WIN32 freopen("special.in", "rb", stdin); freopen("special.out", "wb", stdout); #endif scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d %d", &points[i].first, &points[i].second); points[i].first += 17; points[i].second += 15; insertPoint(points[i]); } sort(points, points + N); int sol = 0; for (int st = 0, fn = 0; st < N; st = fn) { fn = st; while (fn < N && points[fn].first == points[st].first) { fn++; } for (int i = st; i < fn; i++) { for (int j = i + 1; j < fn; j++) { int delta = points[j].second - points[i].second; sol += havePoint(make_pair(points[i].first - delta, points[i].second)); sol += havePoint(make_pair(points[i].first + delta, points[i].second)); sol += havePoint(make_pair(points[j].first - delta, points[j].second)); sol += havePoint(make_pair(points[j].first + delta, points[j].second)); } } } printf("%d\n", sol); }