1585
Созвездие «Сердце»
```
from bisect import bisect_left
from itertools import accumulate
n = int(input())
W = 2001
cols = {}
rowmask = {}
rowrev = {}
for _ in range(n):
x, y = map(int, input().split())
cols.setdefault(x, []).append(y)
rowmask[y] = rowmask.get(y, 0) | (1 << x)
rowrev[y] = rowrev.get(y, 0) | (1 << (W - 1 - x))
rows_sorted = sorted(rowmask)
ans = 0
for x, ys in cols.items():
if len(ys) < 2:
continue
ys.sort()
didx = {ys[i]: i for i in range(1, len(ys))}
start = bisect_left(rows_sorted, ys[1])
cnt = [0] * (W + 2)
total_e = 0
sh1 = x + 1
sh2 = W - x
for k in range(len(rows_sorted) - 1, start - 1, -1):
r = rows_sorted[k]
M = (rowmask[r] >> sh1) & (rowrev[r] >> sh2)
if not M:
continue
c = didx.get(r)
if c and total_e:
pref = list(accumulate(cnt))
s = 0
m = M
while m:
low = m & -m
d = low.bit_length()
s += pref[d - 1]
m ^= low
ans += c * s
m = M
while m:
low = m & -m
cnt[low.bit_length()] += 1
total_e += 1
m ^= low
print(ans)
```