loj#P6794. 「ICPC World Finals 2020」地形生成器

「ICPC World Finals 2020」地形生成器

题目描述

交互性创意玩家群(Interactive Creative Players Collective, ICPC)正在开发一款新游戏,在这款游戏中,他们希望生成真实地形。ICPC 中的一个工程师受地质运动的启发,提出了一个算法。这个算法从一块平地开始,通过抬升或降低一段连续的地面来反复修改,这样就形成了地垒(被抬升的地面)和地堑(被降低的地面)。这些升降的地面都是随机选取的。ICPC 希望借此能够获得真实地形。

你的任务是解释这样的修改,并最终输出得到的地形。地形用一个长度为 nn 的整数数列表示,每个整数代表 xx 轴上 11nn 的整数点的高度。图 E.1. 中展示了将高度值用线段连接起来的一个例子。

landscape1.png

图 E.1. 样例 1 生成的地形

初始时,所有 nn 个点处高度均为 00。之后的一系列的修改都在此进行。每次修改都会进行如下四种操作中的一种,同时附加两个整数参数 x1x2x_1\le x_2

  • R\texttt R:抬升操作,将从 x1x_1x2x_2 的所有点都抬升 11 高度(包括两端)。
  • D\texttt D:降低操作,将从 x1x_1x2x_2 的所有点都降低 11 高度(包括两端)。
  • H\texttt H:造山,在 x1x_1x2x_2 之间添加一座线性形状的山。
  • V\texttt V:造谷,在 x1x_1x2x_2 之间添加一座线性形状的谷。

向当前地形中添加山的操作如下。首先 x1x_1x2x_2 两点的高度增加 11。如果 x2x1>1x_2-x_1>1,那么点 x1+1x_1+1x21x_2-1 的高度增加 22。如果 x2x1>3x_2-x_1>3,那么点 x1+2x_1+2x22x_2-2 的高度增加 33,以此类推。图 E.2. 展示了一个例子。添加谷的操作和添加山的操作十分类似,只不过用降低高度取代了增加高度。操作中改变高度的最大值出现在 x1x_1x2x_2 的中点。如果 x2x1x_2-x_1 是奇数,那么会有两个相邻的点都改变了这个最大高度,否则只有一个点改变了这个最大高度。

输入格式

输入的第一行包含两个整数 nnkk,其中 n (1n200 000)n\ (1\le n\le 200\ 000) 表示点的个数,k (0k200 000)k\ (0\le k\le 200\ 000) 表示修改的次数。这 nn 个点沿 xx 轴排列,依次编号为 11nn

接下来 kk 行描述修改。每行包含一个字符 cc 和两个整数 x1,x2x_1,x_2。其中 ccR\texttt R, D\texttt D, H\texttt HV\texttt V 中的一个)表示操作类型,x1x_1x2 (1x1x2n)x_2\ (1\le x_1\le x_2\le n) 指定了操作的参数。

输出格式

输出 nn 行,第 ii 行表示按顺序进行所有修改后点 ii 的高度。

20 13
H 12 13
D 5 18
R 13 14
R 8 16
H 2 3
V 10 19
V 3 13
R 8 13
V 3 10
D 5 18
V 11 12
R 1 6
R 14 19

1
2
0
-3
-7
-9
-11
-9
-7
-6
-6
-5
-3
-4
-5
-4
-4
-3
0
0

7 1
H 1 6

1
2
3
3
2
1
0