#P40. Paimon Segment Tree

Paimon Segment Tree

题目描述

Paimon 刚刚学会了可持久化线段树,决定立刻练习一下。于是,Lumine 给了她一个简单的练习题:

给定一个长度为 nn 的序列 a1,a2,,ana_1, a_2, \cdots, a_n, Lumine 会对这个序列进行 mm 次修改。在第 ii 次修改中,给出三个整数 li,ri,xi (1lirin)l_i, r_i, x_i \ (1 \le l_i \le r_i \le n),Lumine 会将所有满足 likril_i \le k \le r_i 的元素 aka_k 修改为 (ak+xi)(a_k + x_i)

定义 ai,ta_{i,t} 为第 tt 次操作之后的 aia_i 的值。这样我们就能记录下每个 aia_i 在历史上的所有版本。 注意,如果 aia_i 在第 tt 次修改中没有被修改,则有 ai,t=ai,t1a_{i,t} = a_{i,t-1}。为方便起见,我们也定义 ai,0a_{i,0}aia_i 的初始值。

在所有修改完成后,荧会给派蒙 qq 个询问,询问关于这些历史值的平方和。 第 kk 个询问由四个整数 lk,rk,xk,ykl_k, r_k, x_k, y_k 表示,要求派蒙计算:

i=lkrkj=xkykai,j2\sum_{i=l_k}^{r_k} \sum_{j=x_k}^{y_k} a_{i,j}^2

请帮助 Paimon 计算所有询问的结果。由于答案可能非常大,请将结果对 109+710^9 + 7 取模后输出。

输入格式

每个测试文件中只有一组数据。

第一行包含三个整数 n,m,qn, m, q (1n,m,q5×104)(1 \le n, m, q \le 5 \times 10^4) 分别表示序列的长度、修改次数和询问次数。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \cdots, a_n (ai<109+7)(|a_i| < 10^9 + 7) 表示序列的初始值。

接下来 mm 行中,第 ii 行包含三个整数 li,ri,xil_i, r_i, x_i (1lirin,xi<109+7)(1 \le l_i \le r_i \le n, |x_i| < 10^9 + 7) 表示第 ii 次修改。

接下来 qq 行中,第 ii 行包含四个整数 li,ri,xi,yil_i, r_i, x_i, y_i (1lirin,0xiyim)(1 \le l_i \le r_i \le n, 0 \le x_i \le y_i \le m) 表示第 ii 次询问。

输出格式

对于每个询问,输出一行,一个整数,表示答案对 109+710^9 + 7 取模的结果。

3 1 1
8 1 6
2 3 2
2 2 0 0
1
4 3 3
2 3 2 2
1 1 6
1 3 3
1 3 6
2 2 2 3
1 4 1 3
4 4 2 3
180
825
8