Processing math: 100%
编程题

数组操作

题目描述

给出一个长度为 n 的数组 {A},由 1 到 n 标号 , 你需要维护 m 个操作。

操作分为三种,输入格式为:

1 L R d,将数组中下标 L 到 R 的位置都加上 d,即对于 L<=i<=R,执行A[i]=A[i]+d。


2 L1 R1 L2 R2,将数组中下标为 L1 到 R1 的位置,赋值成 L2 到 R2 的值,保证 R1-L1=R2-L2。

换句话说先对 0<=i<=R2-L2 执行 B[i]=A[L2+i],再对 0<=i<=R1-L1 执行 A[L1+i]=B[i],其中 {B} 为一个临时数组。


3 L R,求数组中下标 L 到 R 的位置的和,即求出 (i=LR)Ai

输入格式

从标准输入读入数据。

第一行一个整数 Case,表示测试点编号,其中 Case=0 表示该点为样例。

第二行包含两个整数 n,m。保证 \(1<=n,m<=10^5\)。

第三行包含 n 个整数 \(A_i\),表示这个数组的初值。保证 \(0<=A_i<=10^5\)。

接下来 m 每行描述一个操作,格式如问题描述所示。

对于操作中提到每个数,满足 0<=d<=10^5,1<=L<=R<=n,1<=L1<=R1<=n,1<=L2<=R2<=n,R1-L1=R2-L2。

输出格式

输出到标准输出。

对于每次 3 操作输出一行一个数,表示求和的结果。

样例输入

0

5 6

1 2 3 4 5

2 1 3 3 5

3 3 5

1 2 4 2

3 3 5

2 1 3 3 5

3 1 5

样例输出

14

18

29

查看答案
赣ICP备20007335号-2