Problem:
Score : 400 points

Problem Statement

You have a sequence A composed of N positive integers: A_{1}, A_{2}, \cdots, A_{N}.

You will now successively do the following Q operations:

In the i-th operation, you replace every element whose value is B_{i} with C_{i}.

For each i (1 \leq i \leq Q), find S_{i}: the sum of all elements in A just after the i-th operation.

Constraints

All values in input are integers.

1 \leq N, Q, A_{i}, B_{i}, C_{i} \leq 10^{5}

B_{i} \neq C_{i}

Input

Input is given from Standard Input in the following format:

N
A_{1} A_{2} \cdots A_{N}
Q
B_{1} C_{1}
B_{2} C_{2}
\vdots
B_{Q} C_{Q}

Output

Print Q integers S_{i} to Standard Output in the following format:

S_{1}
S_{2}
\vdots
S_{Q}

Note that S_{i} may not fit into a 32-bit integer.

Sample Input 1

4
1 2 3 4
3
1 2
3 4
2 4

Sample Output 1

11
12
16

Initially, the sequence A is 1,2,3,4.

After each operation, it becomes the following:

2, 2, 3, 4

2, 2, 4, 4

4, 4, 4, 4

Sample Input 2

4
1 1 1 1
3
1 2
2 1
3 5

Sample Output 2

8
4
4

Note that the sequence A may not contain an element whose value is B_{i}.

Sample Input 3

2
1 2
3
1 100
2 100
100 1000

Sample Output 3

102
200
2000

Solution in C (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

#define MODULE 
#define RAND(min,max) (rand()%(max-min+1)+min)
#define LOGI(log) printf("\n%d\n",log);
#define LOGS(log) printf("\n%s\n",log);
#define DEBUG() //{printf("\nDEBUG %d\n",num_debug);num_debug++;}
char num_debug = 0;

int compare_int(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}
int nibun(int Array[], int n, int target) {
	int l = 0;
	int r = n;
	int p = (l + r) / 2;

	while (l <= r) {
		if (Array[p] < target)
			l = p + 1;
		else if (target < Array[p])
			r = p - 1;
		else
			break;
		p = (l + r) / 2;
	}
	//printf("p:%d l:%d r:%d\n", p, l, r);//degub

	if (r < l)
		return -1;

	r = p;
	if (p != 0) {
		while (l<r) {
			//printf("p:%d l:%d r:%d\n", p,l,r);//debug
			p = (r + l) / 2;
			if (Array[p] == target)
				r = p;
			else
				l = p + 1;
		}
	}
	p = r;

	return p;
}
void display(int Array[], int n) {
	for (int j = 0; j < n; j++)
		printf("%d ", Array[j]);
	printf("\n");
}

int main(void) {
	srand((unsigned)time(NULL));

	int N, * A, Q, * B, * C;
	scanf("%d", &N);
	A = (int*)calloc(N, sizeof(int));
	for(int i=0;i<N;i++)
		scanf("%d", &A[i]);
	scanf("%d", &Q);
	B = (int*)calloc(Q, sizeof(int));
	C = (int*)calloc(Q, sizeof(int));
	for (int i = 0; i < Q; i++)
		scanf("%d%d", &B[i],&C[i]);
	//display(B, Q);
	//display(C, Q);
	//printf("\n");

	unsigned long int sum = 0;
	for (int i = 0; i < Q; i++) {
		int p;
		int time = 0;

		qsort(A, N, sizeof(int), compare_int);
		//display(A, N);

		p = nibun(A,N,B[i]);
		LOGI(p)
		if(p!=-1)
			while (A[p]==B[i])
			{
				A[p] = C[i];
				p++;
				time++
				DEBUG();
			}
		display(A, N);

		if(i==0)
			for (int j = 0; j < N; j++) {
				sum += A[j];

			}
		else {
			sum += (C[i] - B[i]) * time;
		}
		printf("%lu\n", sum);
	}

	free(A);
	//DEBUG()
	free(B);
	//DEBUG()
	free(C);
	//DEBUG()
	return 0;
}