lz的序列问题
题号:NC279320
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

定义一段区间[l,r]的美丽值为(a_{l} + a_{l} * a_{l +1} +a_{l} * a_{l +1} * a_{l + 2} +......+a_{l}*...*a_{r})
已知一段序列有 n 个数,第 i 个数为a_{i}( 1 \leq a_{i} \leq 10^{9})。你需要对序列进行 q 次操作。
每次可进行以下两种操作中的一种:
1、将区间 [l,r] 内每一个数都改为 x 。
2、输出区间 [l,r] 的美丽值。

输入描述:

第一行两个整数n ( 1 \leq n \leq 10 ^ {5})q( 1 \leq q \leq 10^{5})
第二行 n 个整数表示数组a,其中1 \leq a_{i} \leq 10^{9}
接下来 q 行,每行首先输入一个整数 op 表示操作类型。
op == 1,同一行输入3个整数l,r,x (1 \leq l\leq r \leq n, 1 \leq x \leq 10^{9})
op==2同一行输入2个整数
l,r (1 \leq l\leq r \leq n)

输出描述:

输出若干行整数,即为所有操作 2 的结果。
答案可能很大, 输出对 1000000007 取模的结果.
示例1

输入

复制
5 5
1 2 3 4 5
2 1 3
2 2 5
1 1 3 2
1 2 4 3
2 1 5

输出

复制
9
152
350