题目描述
给出一个长度为 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 执行 Bi←AL2+i,再对 0≤i≤R1−L1 执行 AL1+i←Bi,其中 {B} 为一个临时数组。
3 L R
,求数组中下标 L 到 R 的位置的和,即求出 i=L∑rAi。
输入格式
从标准输入读入数据。
第一行一个整数 Case,表示测试点编号,其中 Case 为 0 时表示该点为样例。
第二行包含两个整数 n,m。保证 1≤n,m≤105。
第三行包含 n 个整数 Ai,表示这个数组的初值。保证 0≤Ai≤105。
接下来 m 每行描述一个操作,格式如问题描述所示。
对于操作中提到每个数,满足 0≤d≤105,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
提示
测试点 |
n,m |
其他约束 |
1,2 |
≤103 |
无 |
3,4 |
≤105 |
没有 2 操作 |
5,6,7 |
n 为偶数,且所有 2 操作满足 L1=1,R1=⌊2n⌋,L2=⌊2n⌋+1,R2=n |
8,9,10 |
无 |
对于 100% 的评测用例,1≤n≤105,0≤ai<bi≤10000。