import bisect class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) def update(self, idx, delta=1): while idx <= self.n: self.tree[idx] += delta idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res += self.tree[idx] idx -= idx & -idx return res def main(): import sys input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) from collections import defaultdict freq = defaultdict(int) for num in A: freq[num] += 1 ans = 0 for x in freq: cnt_x = freq[x] if cnt_x == N: ans += N * (N + 1) // 2 continue s = [0] * (N + 1) prefix = 0 for i in range(1, N + 1): if A[i-1] == x: prefix += 1 s[i] = 2 * prefix - i sorted_s = sorted(set(s)) rank_dict = {v: i+1 for i, v in enumerate(sorted_s)} ft = FenwickTree(len(sorted_s)) count = 0 ft.update(rank_dict[s[0]]) for i in range(1, N + 1): idx = bisect.bisect_left(sorted_s, s[i]) count += ft.query(idx) ft.update(rank_dict[s[i]]) ans += count print(ans) if __name__ == "__main__": main()