#1152. 序列变换

序列变换

序列变换(runes)

题目描述

Y 同学在探索遗迹时发现了一行共 2n2^n 个神秘的符文,每个符文都蕴含着一定的能量值。我们将这些符文从左到右依次编号为 1,2,…,2n1, 2, \dots, 2^n,第 ii 个符文的初始能量值为 aia_i。

这行符文的结构具有特殊的分治特性,Y 同学可以通过施加咒语来改变符文的排列或能量分布。总共有 qq 次操作,操作分为以下四类:

  1. 能量强化:给定位置 xx 和能量值 kk,将第 xx 个符文的能量值修改为 kk。
  2. 镜像翻转:给定参数 kk,将整个符文序列划分为 2n−k2^{n-k} 个连续的子块,每个子块的长度均为 2k2^k。对于每一个子块,将其内部的符文顺序进行完全反转。
  3. 结构互换:给定参数 kk,将整个符文序列划分为 2n−k−12^{n-k-1} 个连续的子块,每个子块的长度均为 2k+12^{k+1}。对于每一个子块,交换其左半部分(长度为 2k2^k)与右半部分(长度为 2k2^k)的符文位置。
  4. 能量感应:给定闭区间 [l,r][l, r],计算并输出该区间内所有符文能量值的总和。

请你帮助 Y 同学计算出每次“能量感应”操作的结果。

输入格式

第一行包含两个整数 nn 和 qq,分别表示序列长度的对数和操作的总次数。

第二行包含 2n2^n 个整数 a1,a2,…,a2na_1, a_2, \dots, a_{2^n},表示各个符文的初始能量值。

接下来的 qq 行,每行描述一个操作:

  • 1 x k:执行第 1 类操作,将 axa_x 修改为 kk。
  • 2 k:执行第 2 类操作,参数为 kk。
  • 3 k:执行第 3 类操作,参数为 kk。
  • 4 l r:执行第 4 类操作,查询区间 [l,r][l, r] 的能量总和。

输出格式

对于每个第 4 类操作,输出一行一个整数,代表查询的区间能量总和。

样例

样例输入 #1

2 3
7 4 9 9
1 2 8
3 1
4 2 4

样例输出 #1

24

样例输入 #2

3 8
7 0 8 8 7 1 5 2
4 3 7
2 1
3 2
4 1 6
2 3
1 5 16
4 8 8
3 0

样例输出 #2

29
22
1

数据范围与约定

对于 100%100\% 的数据,保证 0≤n≤180 \le n \le 18,1≤q≤1051 \le q \le 10^5,0≤ai,k≤1090 \le a_i, k \le 10^9。 操作参数满足 1≤x≤2n1 \le x \le 2^n,0≤k≤n0 \le k \le n(第 2 类),0≤k<n0 \le k < n(第 3 类),1≤l≤r≤2n1 \le l \le r \le 2^n。

测试点编号 分值 n≤n \le q≤q \le 特殊性质
1∼41 \sim 4 2020 1010 10001000 无
5∼85 \sim 8 1818 10510^5 特殊性质 A
9∼129 \sim 12 特殊性质 B
13∼1613 \sim 16 1616 5⋅1045 \cdot 10^4 无
17∼2017 \sim 20 1818 10510^5
  • 特殊性质 A:保证不存在第 2 类(镜像翻转)和第 3 类(结构互换)操作。
  • 特殊性质 B:保证不存在第 1 类(能量强化)操作。

统计

相关

在下列比赛中:

1