#P1418. Orange的区间修改V

Orange的区间修改V

Orange的区间修改V

题目描述

Orange将给定数列 a[1],a[2],,a[n]a[1], a[2], \dots, a[n],你需要依次进行 MM 个操作,操作有三类:

  • 1 l r x:给定 l,r,xl,r,x,对于所有 i[l,r]i\in[l,r],将 a[i]a[i] 乘上 xx(换言之,将 a[l],a[l+1],,a[r]a[l], a[l+1], \dots, a[r] 分别乘上 xx);
  • 2 l r x:给定 l,r,xl,r,x,对于所有 i[l,r]i\in[l,r],将 a[i]a[i] 加上 xx(换言之,将 a[l],a[l+1],,a[r]a[l], a[l+1], \dots, a[r] 分别加上 xx);
  • 3 l r:给定 l,rl,r,求 i=lra[i]modP\sum_{i=l}^ra[i] \bmod P 的值(换言之,求 (a[l]+a[l+1]++a[r])modP(a[l]+a[l+1]+\dots+a[r]) \bmod P 的值)。

输入格式

第一行两个整数 nnPP

第二行含有 nn 个非负整数,从左到右依次为 a1,a2,,ana_1,a_2,\cdots ,a_n

第三行有一个整数 MM,表示操作总数;

从第四行开始每行描述一个操作,输入的操作有以下三种形式:

  • 操作 1:1 l r x,表示把所有满足 lirl\le i\le raia_i 改为 ai×xa_i\times x
  • 操作 2:2 l r x,表示把所有满足 lirl\le i\le raia_i 改为 ai+xa_i+x
  • 操作 3:3 l r,询问所有满足 lirl\le i\le raia_i 的和模 PP 的值。

同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

数据范围

对于全部测试数据,$1\le t\le g\le n,0\le c,a_i\le 10^9,1\le P\le 10^9+7$。

输出格式

对每个操作 33,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

样例 #1

样例输入 #1

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7

样例输出 #1

2
35
8