Загрузка данных


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)
```