Serval and Toxel's Arrays (Codeforces 1789C)
Tags: Math, combinatorics

Toxel likes arrays. Before traveling to the Paldea region, Serval gave him an array $$$a$$$ as a gift. This array has $$$n$$$ pairwise distinct elements.In order to get more arrays, Toxel performed $$$m$$$ operations with the initial array. In the $$$i$$$-th operation, he modified the $$$p_{i}$$$-th element of the $$$(i-1)$$$-th array to $$$v_{i}$$$, resulting in the $$$i$$$-th array (the initial array $$$a$$$ is numbered as $$$0$$$). During modifications, Toxel guaranteed that the elements of each array are still pairwise distinct after each operation.Finally, Toxel got $$$m+1$$$ arrays and denoted them as $$$A_{0}=a, A_{1},\ldots,A_{m}$$$. For each pair $$$(i,j)$$$ ($$$0\le i<j\le m$$$), Toxel defines its value as the number of distinct elements of the concatenation of $$$A_{i}$$$ and $$$A_{j}$$$. Now Toxel wonders, what is the sum of the values of all pairs? Please help him to calculate the answer.

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1\le t\le10^{4}$$$). The description of the test cases follows.The first line of each test case contains two integers $$$n$$$ and $$$m$$$ ($$$1\le n,m\le2\cdot10^{5}$$$) — the length of the array and the number of operations.The second line of each test case contains $$$n$$$ integers $$$a_{1},a_{2},\dots,a_{n}$$$ ($$$1\le a_{i}\le n+m$$$). It is guaranteed that all $$$a_i$$$ are pairwise distinct.Each of the next $$$m$$$ lines of each test case contains two integers $$$p_{i}$$$ and $$$v_{i}$$$ ($$$1\le p_{i}\le n$$$, $$$1\le v_{i}\le n+m$$$) — the position of the modified element and its new value. It is guaranteed that the elements of each array are still pairwise distinct after each modification.It is guaranteed that the sum of $$$n$$$ and the sum of $$$m$$$ over all test cases do not exceed $$$2\cdot10^{5}$$$.

Output: For each test case, print a single integer — the sum of the values of all pairs of arrays.

Note: In the first test case, the arrays change as follows: $$$[1,2,3]\to[\underline{4},2,3]\to[4,\underline{5},3]$$$.The concatenation of the $$$0$$$-th array and the $$$1$$$-st array is $$$\require{cancel}[1,2,3,4,\cancel{2},\cancel{3}]$$$. There are $$$4$$$ distinct elements.The concatenation of the $$$0$$$-th array and the $$$2$$$-nd array is $$$\require{cancel}[1,2,3,4,5,\cancel{3}]$$$. There are $$$5$$$ distinct elements.The concatenation of the $$$1$$$-st array and the $$$2$$$-nd array is $$$\require{cancel}[4,2,3,\cancel{4},5,\cancel{3}]$$$. There are $$$4$$$ distinct elements.Strikethrough elements are duplicates in the array.Therefore, the answer is $$$4+5+4=13$$$.In the second test case, note that the array may remain unchanged after operations.

Sample Inputs:
3
3 2
1 2 3
1 4
2 5
1 1
1
1 1
10 10
4 6 9 12 16 20 2 10 19 7
1 3
5 4
2 17
2 18
6 11
7 1
8 17
5 5
5 5
2 2

Sample Outputs:
13
1
705

Solution (Python):
import sys
input = sys.stdin.readline

def solve():
    (n, m) = map(int, input().split())
    v = list(map(int, input().split()))
    freq = [0] * (n + m + 1)
    firstOccurrence = [0] * (n + m + 1)
    for i in range(n):
        firstOccurrence[v[i]] = 0
    currRepititions = 0
    temp = [0] * n
    ans = 0
    for i in range(m):
        (a, b) = map(int, input().split())
        a -= 1
        prevVal = v[a]
        prevFreq = i + 1 - firstOccurrence[prevVal]
        freq[prevVal] += prevFreq
        v[a] = b
        firstOccurrence[b] = i + 1
        currRepititions -= temp[a]
        temp[a] = i + 1 - freq[b]
        currRepititions += temp[a]
        ans += currRepititions
    vals = (m + 1) * m // 2
    print(ans + vals * n)
    return 0
t = int(input())
for i in range(1, t + 1):
    solve()

Solution (Python):
for _ in range(int(input())):
    (n, m) = map(int, input().split())
    a = list(map(int, input().split()))
    cnt = [0] * (n + m + 1)
    for i in range(n):
        cnt[a[i]] = m + 1
    for i in range(m):
        (p, v) = map(int, input().split())
        p -= 1
        cnt[a[p]] -= m - i
        cnt[v] += m - i
        a[p] = v
    ans = n * m * (m + 1)
    for i in range(n + m + 1):
        ans -= cnt[i] * (cnt[i] - 1) // 2
    print(ans)

Solution (Python):
for i in range(int(input())):
    (n, m) = map(int, input().split())
    a = list(map(int, input().split()))
    cn = [0] * (n + m + 1)
    ans = n * m * (m + 1)
    for i in range(n):
        cn[a[i]] = m + 1
    for i in range(m):
        (p, v) = map(int, input().split())
        cn[a[p - 1]] -= m - i
        cn[v] += m - i
        a[p - 1] = v
    for i in range(n + m + 1):
        ans -= cn[i] * (cn[i] - 1) // 2
    print(ans)