小C的棋王之路
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

题目背景
小C最近迷恋上了下棋,他十分喜爱这款游戏,但是在几天的玩耍之后,他发现他的水平停滞在了白银分段,他现在想要通过一些方式来提升他的下棋水平,现在,他遇到了一个问题想要请求你的帮助。
题目描述
首先,他手上最开始有个英雄,他们的初始攻击力是,并且这些英雄一字型排开,他能够对与区间的英雄进行如下两种操作:
1. 将区间的英雄攻击力每个加上
2. 将区间的英雄攻击力每个乘上
3. 将区间的英雄攻击力置为
4. 在最后一个英雄后添加一个一个攻击力为的英雄

因为他想要在任意时刻知道任意区间英雄的攻击力总和,所以请你实现一个能够在线查找区间的数据结构,使得他能够随时得知区间英雄的攻击力总和。

这里,游戏有一个特殊的地方,就是英雄的攻击力过高时,会将该英雄的攻击力对取模,希望你能够注意。

输入描述:

第一行包含三个整数 分别表示英雄的个数、操作的总个数和模数。
第二行包含个用空格分隔的整数,其中第个数字表示英雄的初始攻击力
接下来 行每行包含若干个整数,表示一个操作,具体如下:
操作 1: 格式: 含义:将区间 内每个英雄的攻击力加上
操作 2: 格式: 含义:将区间 内每个英雄的攻击力乘上
操作 3: 格式:含义: 将区间 内每个英雄的攻击力置为
操作4: 格式: 含义: 在最后一个英雄后增加一个攻击力为 的英雄
操作5: 格式: 含义:输出区间 内每个英雄的攻击力的和并对p取模

输出描述:

输出包含若干行整数,即所有询问(操作5)的答案。
示例1

输入

复制
5 10 38
2 5 4 2 3
1 1 4 1
5 2 5
2 2 4 2
1 3 5 5
5 1 4
3 2 4 20
5 3 5
4 8
3 3 5 7
5 3 6

输出

复制
17
3
10
29

备注:

对于 100% 的数据: