#xDSybttg040304. 1549:最大数

1549:最大数

题目描述

给定一个正整数数列 a1,a2,a3,,ana_1, a_2, a_3, \cdots, a_n,每一个数都在 0p10 \sim p-1 之间。可以对这列数进行两种操作:

  1. 添加操作:向序列后添加一个数,序列长度变成 n+1n+1
  2. 询问操作:询问这个序列中最后 LL 个数中最大的数是多少。

程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。


输入格式

第一行有两个正整数 m,pm, p,意义如题目描述;

接下来 mm 行,每一行表示一个操作。每行的格式为:

  • Q L:表示询问序列中最后 LL 个数的最大数是多少;
  • A t:表示向序列后面加一个数,加入的数是 (t+a)modp(t + a) \bmod p。其中 tt 是输入的参数,aa 是在这个添加操作之前最后一个询问操作的答案(如果之前没有询问操作,则 a=0a=0)。

保证第一个操作一定是添加操作。
对于询问操作,保证 L>0L>0 且不超过当前序列的长度。


输出格式

对于每一个询问操作,输出一行。该行只有一个数,即序列中最后 LL 个数的最大数。


样例

输入样例 1

10 100
A 97
Q 1
Q 1
A 17
Q 2
A 63
Q 1
Q 1
Q 3
A 99

输出样例 1

97
97
97
60
60
97

样例解释

初始序列为空,a=0a = 0

  1. A 97:加入数 (97+0)mod100=97(97 + 0) \bmod 100 = 97,序列:[97][97]
  2. Q 1:询问最后 11 个数的最大值 = 9797,输出 9797,并令 a=97a = 97
  3. Q 1:询问最后 11 个数的最大值 = 9797,输出 9797aa 更新为 9797
  4. A 17:加入数 (17+97)mod100=14(17 + 97) \bmod 100 = 14,序列:[97,14][97, 14]
  5. Q 2:询问最后 22 个数的最大值 = max(97,14)=97\max(97, 14) = 97,输出 9797a=97a = 97
  6. A 63:加入数 (63+97)mod100=60(63 + 97) \bmod 100 = 60,序列:[97,14,60][97, 14, 60]
  7. Q 1:询问最后 11 个数的最大值 = 6060,输出 6060a=60a = 60
  8. Q 1:询问最后 11 个数的最大值 = 6060,输出 6060a=60a = 60
  9. Q 3:询问最后 33 个数的最大值 = max(97,14,60)=97\max(97, 14, 60) = 97,输出 9797a=97a = 97
  10. A 99:加入数 (99+97)mod100=96(99 + 97) \bmod 100 = 96,序列:[97,14,60,96][97, 14, 60, 96]

数据范围

  • 1m2×1051 \le m \le 2 \times 10^5
  • 1p2×1091 \le p \le 2 \times 10^9
  • 0t<p0 \le t < p

时间限制:1000 ms
内存限制:524288 KB


提示

本题可以使用线段树或树状数组维护区间最大值,由于序列是动态添加的,可以先开好 mm 个位置的线段树,添加时在相应位置更新即可。
询问操作是询问最后 LL 个数的最大值,即从当前长度 lenlen 往前推 LL 个位置的区间 [lenL+1,len][len - L + 1, len] 的最大值。

另一种常用方法是使用单调栈或单调队列的思想结合 ST 表(稀疏表),但线段树较为直观。

注意 pp 较大,但所有数字都在 0p10 \sim p-1 之间,运算时注意使用 long long 类型避免溢出。