#P10863. [HBCPC2024] Enchanted

    ID: 10521 远端评测题 1500ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>树状数组2024O2优化可持久化线段树XCPC湖北

[HBCPC2024] Enchanted

Description

在《Minecraft》中,变得更强的一种方式是让盔甲和武器附魔。附魔书在其中扮演了重要角色。

附魔书最重要的属性是其等级。等级越高,书越好。我们可以将两本相同等级 ll 的书合并成一本新书(原来的两本书将消失)。新书的等级为 l+1l+1,合并的费用为 2l+12^{l+1}

现在,Steve 有 nn 本编号从 11nn 的附魔书。最初,第 ii 本书的等级为 aia_i。Steve 请你帮助他完成以下四种操作。

  1. 给定两个整数 l,r(1lrn)l,r(1 \le l \le r \le n),计算通过合并编号从 llrr 的书能达到的最大等级。

  2. 给定三个整数 l,r(1lrn)l,r(1 \le l \le r \le n)kk,然后按照以下步骤操作: 步骤 11:Steve 合并编号从 llrr 的所有书,直到不存在两本等级相同的书。 步骤 22:Steve 将一个新书等级为 kk 的书加入步骤 11 中得到的书中。 步骤 33:Steve 需要合并步骤 22 中得到的书,并希望最大化合并次数。 请计算并输出步骤 33 中的总费用对 109+710^9+7 取模的结果。 \textbf{注意,计算后,序列会恢复。也就是说,此操作实际上不会改变序列。}

  3. 给定两个整数 pos,kpos,k,Steve 将编号为 pospos 的书的等级改为 kk

  4. 给定一个整数 tt,Steve 将序列恢复到第 tt 次操作后的状态。如果 t=0t=0,则 Steve 将序列恢复到初始状态。

Input Format

第一行也是唯一一行包含 5 个整数 n,m,A,p,qn,m,A,p,q。(1n1061 \leq n \leq 10^6, 1m1061 \leq m \leq 10^6, 1A192608171 \leq A \leq 19\,260\,817, 1p41 \leq p \leq 4, 1q301 \leq q \leq 30)

请注意!为了避免输入文件过大,真实输入是通过以下策略构造的:

$\textbf{func rnd():}\ \ \ \\ A \leftarrow (7A+13) \bmod 19\,260\,817\ \ \ \\ \textbf{return } A$

首先,生成 nn 个整数 a1,a2,,ana_1,a_2,\cdots,a_n,依次生成,airnd()modq+1a_i \leftarrow rnd() \bmod q + 1

然后,生成所有操作的参数。

对于每个操作,首先生成操作编号(用 optopt 表示),optrnd()modp+1opt \leftarrow rnd() \bmod p + 1

根据操作编号,不同的操作使用不同的方法生成参数。

  • 对于操作 1:需要通过以下方式获取 llrr

    • Lrnd()modn+1L \leftarrow rnd() \bmod n + 1
    • Rrnd()modn+1R \leftarrow rnd() \bmod n + 1
    • lmin(L,R)l \leftarrow \min(L,R)
    • rmax(L,R)r \leftarrow \max(L,R)
  • 对于操作 2:需要通过以下方式获取 l,rl,rkk

    • Lrnd()modn+1L \leftarrow rnd() \bmod n + 1
    • Rrnd()modn+1R \leftarrow rnd() \bmod n + 1
    • lmin(L,R)l \leftarrow \min(L,R)
    • rmax(L,R)r \leftarrow \max(L,R)
    • krnd()modq+1k \leftarrow rnd() \bmod q + 1
  • 对于操作 3:需要通过以下方式获取 posposkk

    • posrnd()modn+1pos \leftarrow rnd() \bmod n + 1
    • krnd()modq+1k \leftarrow rnd() \bmod q + 1
  • 对于操作 4:需要通过以下方式获取 tt

    • trnd()modit \leftarrow rnd() \bmod i

这里,ii 表示第 ii 次操作。

Output Format

对于每个操作 1 和 2,你需要输出一行整数,表示操作 1 和 2 的答案对 109+710^9 + 7 取模的结果。

6 3 2 1 3
1
3
2
10 15 5 4 7
0
9
9
0
64
0
0

Hint

函数 max 表示参数中的最大值。函数 min 表示参数中的最小值。

在例子 1 中,初始书为 [1,2,3,1,2,3][1,2,3,1,2,3]。三个操作的范围分别是 [4,4][4,4][1,3][1,3][4,5][4,5]。(由 ChatGPT 4o 翻译)