U102285 【模板】区间修改主席树

题目背景

无。

题目描述

给定一个长度为$n$的数列$num$,你需要进行$m$次操作,每次操作规定如下。 `1 t l r x`在版本$t$的基础上,将$[l,r]$中的数都加上$x$。 `2 t l r`查询版本$t$中$[l,r]$中的数的和。 特别地,每次操作均生成一个新的版本,初始数列$num$为第$0$个版本,答案对$10^9+7$取模。

输入格式

第一行,两个整数,$n$和$m$。 第二行,用空格隔开的$n$个数字,第$i$个数字表示$num_i$。 接下来的$m$行,每行用空格隔开$4$或$5$个整数,表示如上所述的一次操作。

输出格式

对于每个操作$2$,输出一行,一个整数,表示答案取模后的结果。

说明/提示

样例1解释:如下表。 | 版本号$t$ | 数列$num$ | 操作 | 输出 | 备注/解释 | | :-----------: | :-----------: | :-----------: | :-----------: | :-----------: | | $0$ | $7 ,6,3,2,4,1,3$ | N/A | N/A | 原始版本 | | $1$ | $12,11,8,2,4,1,3$ | $1\;0\;1\; 3\; 5$ | N/A | 原始版本中的$[1,3]$加上$5$ | | $2$ | $12,13,10,4,6,3,5$ | $1\;1\;2\; 7\; 2$ | N/A | 上一个版本中的$[2,7]$加上$2$ | | $3$ | $12,13,10,4,6,3,5$ | $2\;2\;4\;6$ | 13 | 查询上一个版本$[4,6]$的和 | | $4$ | $13,11,9,2,4,1,3$ | $1\;1\;3\;4\;1$ | N/A | 版本1中的$[3,4]$加上$1$ | | $5$ | $13,11,9,2,4,1,3$ | $2\;4\;1\;5$ | 39 | 求上个版本$[1,5]$的和 | 对于$30\%$的数据,$n,m \le 100$。 对于$100\%$的数据,$n,m \le 10^5$,$0 \le num_i, x \le 10^6$,$1 \le l \le r \le n$。 **运算中,单个节点表示的和在取模前可能高达$10^{11}$,请使用适合的数据类型存储以避免不必要的数据溢出。**