排名
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个长度为 n 的序列 ,设 cnt(x) 表示整数 x 在序列中出现的次数,rank(x) 表示整数 x 在序列 a 所有不同的数的 cnt(x) 中排第 rank(x) 名(cnt 从小到大排序,cnt 相同排名相同),其中 x 为序列中出现的某个数。

现需要对序列进行两种操作:

  1.将 a_x 修改为 y;
  2.对于序列 a 中出现的不同的数 x,求  之和.

例如:

序列 ;

按照 cnt 排序则 , , ;

若对该序列进行2操作,则答案为:
.

输入描述:

第一行一个整数−−−表示序列长度;
第二行n个整数,用空格隔开−−−表示序列;
第三行一个整数−−−表示操作的个数;接下来q行,若为"1 x y"则表示题目中1操作;若为"2"则表示2操作.(输入不包括引号)

输出描述:

对于所有的2操作,输出对应答案,一次操作的输出占一行.
示例1

输入

复制
8
1 1 1 2 2 3 3 4
5
2
1 3 2
2
1 4 4
2

输出

复制
7
7
12

备注:

xor 表示按位异或,参与运算的两个二进制数的对应位中,只要对应的两个二进位不同时,结果位就为1,否则为0。例如在二进制下 10010 xor 11000  01010