[NOI2005]维修数列
题号:NC17396
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格)

操作编号

输入文件中的格式

说明

 

 

1.  

 

 

INSERT_posi_tot_c1_c2_..._ctot

在当前数列的第 posi 个数字后 tot 个数字:c1, c2, , ctot;若在数列首插 入,则 posi  0

 

2.  删除

 

DELETE_posi_tot

从当前数列的第 posi 个数字开始连续

删除 tot 个数字

 

3.  修改

 

MAKE-SAME_posi_tot_c

将当前数列的第 posi 个数字开始的  tot 个数字统一修改为 c

 

4.  翻转

 

REVERSE_posi_tot

取出从当前数列的第 posi 个数字开

 tot 个数字翻转后放入原来的位置

 

5.  

 

GET-SUM_posi_tot

计算从当前数列开始的第 posi 个数

开始的 tot 个数字的和并输出

6.  求和 大的子列

 

MAX-SUM

求出当前数列中和大的一段子列,

并输出最大和


输入描述:

输入文件的第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M

表示要进行的操作数目。

第 2 行包含 N 个数字,描述初始时的数列。

以下 M 行,每行一条命令,格式参见问题描述中的表格。

输出描述:

对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结

果,每个答案(数字)占一行。
示例1

输入

复制
9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM

输出

复制
-1
10
1
10

备注:

本题设有部分分,对于每一个测试点:

l    如果你的程序能在输出文件正确的位置上打印  GET-SUM  操作的答案, 你可以得到该测试点 60%的分数;

l    如果你的程序能在输出文件正确的位置上打印 MAX-SUM 操作的答案, 你可以得到该测试点 40%的分数;

l    以上两条的分数可以叠加,即如果你的程序正确输出所有  GET-SUM  和

MAX-SUM 操作的答案,你可以得到该测试点 100%的分数。

你的程序能正确处理一种操请确定输出文件确的 位置上打印结果,即必须为另一种作留下应的行,否则我们不保证可以正 分。

你可以认为在任何时刻,数列中至少有 1 个数。

输入数据一定是正确的,即指定位置的数在数列中一定存在。

50%的数据中,任何时刻数列中最多含有 30 000 个数;

100%的数据中,任何时刻数列中最多含有 500 000 个数。

100%的数据中,任何时刻数列中任何一个数字均在[-1 000, 1 000]内。

100%的数据中,M ≤20 000,插入的数字总数不超过 4 000 000 个,输入文件

大小不超过 20MBytes。