CF1401F.Reverse and Swap

提高+/省选-

通过率:0%

时间限制:3.00s

内存限制:256MB

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

You are given an array aa of length 2n2^n. You should process qq queries on it. Each query has one of the following 44 types:

  1. Replace(x,k)Replace(x, k) — change axa_x to kk;
  2. Reverse(k)Reverse(k) — reverse each subarray [(i−1)⋅2k+1,i⋅2k][(i-1) \cdot 2^k+1, i \cdot 2^k] for all ii (i≥1i \ge 1);
  3. Swap(k)Swap(k) — swap subarrays [(2i−2)⋅2k+1,(2i−1)⋅2k][(2i-2) \cdot 2^k+1, (2i-1) \cdot 2^k] and [(2i−1)⋅2k+1,2i⋅2k][(2i-1) \cdot 2^k+1, 2i \cdot 2^k] for all ii (i≥1i \ge 1);
  4. Sum(l,r)Sum(l, r) — print the sum of the elements of subarray [l,r][l, r].

Write a program that can quickly process given queries.

给你一个长度为 2n2^n 的数组 aa。你需要处理 qq 个对该数组的查询。每个查询属于以下 44 种类型之一:

  1. Replace(x,k)Replace(x, k) — 将 axa_x 修改为 kk;
  2. Reverse(k)Reverse(k) — 对每个 ii(i≥1i \ge 1),将子数组 [(i−1)⋅2k+1,i⋅2k][(i-1) \cdot 2^k+1, i \cdot 2^k] 进行翻转;
  3. Swap(k)Swap(k) — 对每个 ii(i≥1i \ge 1),交换子数组 [(2i−2)⋅2k+1,(2i−1)⋅2k][(2i-2) \cdot 2^k+1, (2i-1) \cdot 2^k] 与子数组 [(2i−1)⋅2k+1,2i⋅2k][(2i-1) \cdot 2^k+1, 2i \cdot 2^k];
  4. Sum(l,r)Sum(l, r) — 输出子数组 [l,r][l, r] 中所有元素的和。

请编写一个能快速处理上述查询的程序。

输入格式

The first line contains two integers nn, qq (0≤n≤180 \le n \le 18; 1≤q≤1051 \le q \le 10^5) — the length of array aa and the number of queries.

The second line contains 2n2^n integers a1,a2,…,a2na_1, a_2, \ldots, a_{2^n} (0≤ai≤1090 \le a_i \le 10^9).

Next qq lines contains queries — one per line. Each query has one of 44 types:

  • "11 xx kk" (1≤x≤2n1 \le x \le 2^n; 0≤k≤1090 \le k \le 10^9) — Replace(x,k)Replace(x, k);
  • "22 kk" (0≤k≤n0 \le k \le n) — Reverse(k)Reverse(k);
  • "33 kk" (0≤k<n0 \le k \lt n) — Swap(k)Swap(k);
  • "44 ll rr" (1≤l≤r≤2n1 \le l \le r \le 2^n) — Sum(l,r)Sum(l, r).

It is guaranteed that there is at least one SumSum query.

第一行包含两个整数 nn、qq(0≤n≤180 \le n \le 18;1≤q≤1051 \le q \le 10^5)—— 分别表示数组 aa 的长度和查询次数。

第二行包含 2n2^n 个整数 a1,a2,…,a2na_1, a_2, \ldots, a_{2^n}(0≤ai≤1090 \le a_i \le 10^9)。

接下来 qq 行,每行一个查询。每个查询为以下四种类型之一:

  • “11 xx kk”(1≤x≤2n1 \le x \le 2^n;0≤k≤1090 \le k \le 10^9)—— 执行 Replace(x,k)Replace(x, k);
  • “22 kk”(0≤k≤n0 \le k \le n)—— 执行 Reverse(k)Reverse(k);
  • “33 kk”(0≤k<n0 \le k \lt n)—— 执行 Swap(k)Swap(k);
  • “44 ll rr”(1≤l≤r≤2n1 \le l \le r \le 2^n)—— 执行 Sum(l,r)Sum(l, r)。

保证至少存在一个 SumSum 查询。

输出格式

Print the answer for each SumSum query.

对每个 SumSum 查询,输出答案。

输入输出样例

  • 输入#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

说明/提示

In the first sample, initially, the array aa is equal to 7,4,9,9{7,4,9,9}.

After processing the first query. the array aa becomes 7,8,9,9{7,8,9,9}.

After processing the second query, the array aia_i becomes 9,9,7,8{9,9,7,8}

Therefore, the answer to the third query is 9+7+8=249+7+8=24.

In the second sample, initially, the array aa is equal to 7,0,8,8,7,1,5,2{7,0,8,8,7,1,5,2}. What happens next is:

  1. Sum(3,7)Sum(3, 7) →\to 8+8+7+1+5=298 + 8 + 7 + 1 + 5 = 29;
  2. Reverse(1)Reverse(1) →\to 0,7,8,8,1,7,2,5{0,7,8,8,1,7,2,5};
  3. Swap(2)Swap(2) →\to 1,7,2,5,0,7,8,8{1,7,2,5,0,7,8,8};
  4. Sum(1,6)Sum(1, 6) →\to 1+7+2+5+0+7=221 + 7 + 2 + 5 + 0 + 7 = 22;
  5. Reverse(3)Reverse(3) →\to 8,8,7,0,5,2,7,1{8,8,7,0,5,2,7,1};
  6. Replace(5,16)Replace(5, 16) →\to 8,8,7,0,16,2,7,1{8,8,7,0,16,2,7,1};
  7. Sum(8,8)Sum(8, 8) →\to 11;
  8. Swap(0)Swap(0) →\to 8,8,0,7,2,16,1,7{8,8,0,7,2,16,1,7}.

在第一个样例中,初始时数组 aa 为 7,4,9,9{7,4,9,9}。

处理第一个查询后,数组 aa 变为 7,8,9,9{7,8,9,9}。

处理第二个查询后,数组 aia_i 变为 9,9,7,8{9,9,7,8}。

因此,第三个查询的答案为 9+7+8=249+7+8=24。

在第二个样例中,初始时数组 aa 为 7,0,8,8,7,1,5,2{7,0,8,8,7,1,5,2}。接下来的操作如下:

  1. Sum(3,7)Sum(3, 7) →\to 8+8+7+1+5=298 + 8 + 7 + 1 + 5 = 29;
  2. Reverse(1)Reverse(1) →\to 0,7,8,8,1,7,2,5{0,7,8,8,1,7,2,5};
  3. Swap(2)Swap(2) →\to 1,7,2,5,0,7,8,8{1,7,2,5,0,7,8,8};
  4. Sum(1,6)Sum(1, 6) →\to 1+7+2+5+0+7=221 + 7 + 2 + 5 + 0 + 7 = 22;
  5. Reverse(3)Reverse(3) →\to 8,8,7,0,5,2,7,1{8,8,7,0,5,2,7,1};
  6. Replace(5,16)Replace(5, 16) →\to 8,8,7,0,16,2,7,1{8,8,7,0,16,2,7,1};
  7. Sum(8,8)Sum(8, 8) →\to 11;
  8. Swap(0)Swap(0) →\to 8,8,0,7,2,16,1,7{8,8,0,7,2,16,1,7}。

输入解题思路,AI测评打分。不知道怎么写?

首页