1473 : 十二平均律
题目描述Description
曾学长不仅在算法竞赛领域有一定地位,而且还在作曲领域造诣颇深。在紧张的算法竞赛训练之余,曾学长还正着手谱写旷世巨著「I Got CPC」,剑指格莱美。
曾学长的音乐基于十二平均律创作。十二平均律是当今最主流的律式,是现代国际通用的标准音律。它将一个音乐中的一个八度平均分成十二等份,每等分称为半音,音高八度音指的是频率乘上二倍。八度音的频率分为十二等分,即是分为十二项的等比数列,也就是每个音的频率为前一个音的2的12次方根倍。根据十二平均律,一个八度内有12个音,它们的音名分别如下
- C
- C#
- D
- D#
- E
- F
- F#
- G
- G#
- A
- A#
- B
由于算法竞赛训练强度非常大,曾学长用于音乐创作的时间很少,所以她选择只用一个八度内的音来创作。也就是说,只需要考虑上述的十二个音名,不需要额外考虑八度数。
由于时间过于紧迫,曾学长实在没空过于细致地构思旋律,而是打算用气势糊弄过去。在创作中,曾学长打算在每一拍中只演奏一个音,或是在每一拍中只演奏一个和弦。所谓和弦,就是由多个音同时演奏组成的音。例如,C大三和弦由三个音“C,E,G”组成。
曾学长的CPU非常差劲,三缓只有区区1248MB,用它处理音乐实在是强人所难。聪明的曾学长决定将各拍的音(或者和弦)编码为独热向量的十进制表示之后再输入电脑中处理。所谓编码独热向量,就是指对每一拍,根据其中的音或和弦,将它们编码为12位二进制数,以从C、C#、D、…、B的顺序,每一个二进制位表示一个音,再转为十进制。例如,一个单音的A独热向量编码为001000000000,十进制表示下为512;C大三和弦C、E、G的编码为000010010001,十进制下表示为145。
曾学长的乐曲已经基本完成了,但是精益求精的曾学长还是决定对她的乐曲进行一些修改。她需要不时用其它的和弦替换乐曲中原有的一些和弦。另外,她有时还需要对乐曲整体进行升调操作。所谓升调,就是将乐曲中原有的的音全部变成比它高半音的音。即将乐曲中,包括和弦中所有的C变成C#,C#变成D,D变成D#,…,A#变成B,B变成C。
曾学长对于音乐有非常独到的理解,她认为,音乐的好坏应该由歌曲中所有独热向量的异或和表示。所谓异或和是指对于给定的多个数,将它们的二进制表示按位进行异或操作,得到一个新的二进制数作为结果。例如,给定三个数5、7和9,它们的二进制表示分别为101、111和1001,那么它们的异或和为1010,在十进制下表示为10。
曾学长性情极端急躁,在每一次完成修改之后,她都迫不及待地想知道修改后的歌曲的好坏,也就是修改后的歌曲中所有独热向量的异或和。但算法竞赛训练强度非常大,曾学长不可能浪费她宝贵的时间来计算。请你帮曾学长写个程序,计算每一次修改后歌曲中所有独热向量的异或和。
输入格式Input
输入的第一行为一个数n,表示歌曲中含有的拍的个数。输入保证1 \leq n \leq 2 \times 10^5
输入的第二行到第n+1行表示原曲中各节拍原先含有的和弦。每一行的开头均为一个数k,表示这一拍的和弦中含有音的数量。接下来是k个音,音以不含八度数的音名的形式给出,不同音之间用空格隔开。输入保证k \leq 12。
输入的接下来若干行表示曾学长计划进行的操作。每一行的开头为一个数字o,表示曾学长进行操作的种类。若o=1,则曾学长进行替换操作,接下来的一个数字p表示曾学长需要替换的和弦在原曲中的位置,一个数字s表示新和弦中含有的音的数量。接下来是s个音名,它们是新和弦中的音名,用空格隔开;若o=2,则曾学长进行升调操作。输入保证曾学长进行的操作数量不超过 2 \times 10^5 个,1 \leq o \leq 2,1 \leq p \leq n, s \leq 12。
输出格式Output
对于每一次操作,输出一行,包含一个数,表示乐曲中所有独热向量的异或和(使用十进制表示)。
样例Sample
提示Hint
每次操作之间不独立
出题Author
ζ