luogu#P11334. [NOISG2020 Finals] Progression

[NOISG2020 Finals] Progression

题目背景

Damian 正在开发一款视频游戏!

题目描述

该游戏包含 NN 个任务,第 ii 个任务的初始难度为 DiD_i。为了让玩家感受到难度的渐进性,Damian 对任务难度进行了若干次调整操作。

游戏设计支持两种操作:

  1. 补丁操作:将任务 LLRR 的难度按公式 Di=Di+S+(iL)×CD_i = D_i + S + (i - L) \times C 增加。
  2. 重写操作:将任务 LLRR 的难度直接设置为 Di=S+(iL)×CD_i = S + (i - L) \times C

为了让游戏更加有趣,Damian 希望找到任务的连续子序列,使它们的难度呈等差数列。玩家可以按顺序或倒序完成任务。任务 aabb (1abN1 \leq a \leq b \leq N) 构成可玩子段当且仅当对所有 ai<ba \leq i < b,满足 Di+1Di=kD_{i+1} - D_i = kkk 为某个整数,可以为负)。单个任务也构成长度为 11 的可玩子段。

Damian 有时需要回答一个查询:找出某一区间内最长的可玩子段长度。你需要帮助 Damian 处理这些查询。

输入格式

  • 第一行包含两个整数 NNQQ,分别表示任务的数量和操作与查询的总数。
  • 第二行包含 NN 个整数,表示任务的初始难度 D1,D2,,DND_1, D_2, \dots, D_N
  • 接下来的 QQ 行描述操作或查询:
    • 若行首为 11,接下来为 L,R,S,CL, R, S, C,表示补丁操作。
    • 若行首为 22,接下来为 L,R,S,CL, R, S, C,表示重写操作。
    • 若行首为 33,接下来为 L,RL, R,表示查询操作。

输出格式

对于每个查询操作,输出一个整数,表示指定区间内最长的可玩子段长度。

10 6
1 2 3 4 1 2 3 4 5 5
3 1 10
1 1 4 -1 -1
3 1 10
3 9 10
2 5 10 -2 -2
3 1 10
5
6
2
7
10 5
1 2 3 4 1 2 3 4 5 5
3 1 10
1 1 10 1 2
3 1 10
2 1 10 3 4
3 1 10
5
5
10
10 5
1 2 3 4 1 2 3 4 5 5
3 1 4
3 4 5
3 2 4
3 5 9
3 10 10
4
2
3
5
1

提示

【样例解释】

对于样例 #1:

  • 第一次查询时,任务 5599 构成最长可玩子段。
  • 第一次补丁操作后,任务难度变为 [0,0,0,0,1,2,3,4,5,5][0, 0, 0, 0, 1, 2, 3, 4, 5, 5]
    第二次查询时,任务 4499 构成最长可玩子段。
  • 第二次补丁操作后,任务难度变为 [0,0,0,0,2,4,6,8,10,12][0, 0, 0, 0, -2, -4, -6, -8, -10, -12]
    最后一次查询时,任务 441010 构成最长可玩子段。

【数据范围】

  • 1N,Q3×1051 \leq N, Q \leq 3 \times 10^5
  • 106Di,S,C106-10^6 \leq D_i, S, C \leq 10^6
  • 1LRN1 \leq L \leq R \leq N
子任务编号 分值 限制条件
11 99 L=1,R=NL = 1, R = N
22 1515 1N,Q1031 \leq N, Q \leq 10^3
33 3535 无补丁和重写操作。
44 1111 L=RL = R
55 1313 无重写操作。
66 1717 无额外限制。