만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

파이몬의 세그먼트 트리

시간 제한2초메모리 제한1024 MB

요약
길이 n인 배열에 구간 덧셈이 m번 적용될 때, 인덱스 구간과 시점 구간에 걸친 a의 제곱합을 10^9+7로 나눈 나머지로 q개의 질의마다 구합니다.
난이도

어려움10점 중 9점

유형
세그먼트 트리, 누적 합, 수학
정답자
아직 제출이 없습니다

문제

파이몬은 방금 지속성 세그먼트 트리를 배웠고, 바로 연습해 보려 한다. 그래서 루미네는 시작하기 좋은 쉬운 문제를 하나 준다.

길이가 nn인 수열 a1,a2,⋯ ,ana_1, a_2, \cdots, a_n이 주어진다. 루미네는 이 수열에 mm번의 변경을 적용한다. ii번째 변경은 세 정수 lil_i, rir_i (1≤li≤ri≤n1 \le l_i \le r_i \le n)와 xix_i로 주어지며, li≤k≤ril_i \le k \le r_i인 모든 kk에 대해 aka_k를 ak+xia_k + x_i로 바꾼다.

ai,ta_{i,t}를 tt번째 변경 직후의 aia_i 값이라고 하자. 이렇게 하면 aia_i의 과거 값을 모두 추적할 수 있다. tt번째 변경이 aia_i를 건드리지 않았다면 ai,ta_{i,t}는 ai,t−1a_{i,t-1}과 같다. 완전성을 위해 ai,0a_{i,0}은 aia_i의 초기 값으로 정의한다.

모든 변경이 끝난 뒤, 루미네는 파이몬에게 qq개의 질의를 준다. kk번째 질의는 네 정수 lkl_k, rkr_k, xkx_k, yky_k로 주어지며, 다음 값을 구해야 한다.

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

모든 질의의 답을 구하라. 답이 매우 클 수 있으므로 각 답은 109+710^9 + 7로 나눈 나머지로 출력한다.

입력

첫 줄에는 세 정수 nn, mm, qq (1≤n,m,q≤5×1041 \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개 줄에는 각각 변경을 나타내는 lil_i, rir_i, xix_i (1≤li≤ri≤n1 \le l_i \le r_i \le n, ∣xi∣<109+7|x_i| < 10^9 + 7)가 주어진다.

다음 qq개 줄에는 각각 질의를 나타내는 lkl_k, rkr_k, xkx_k, yky_k (1≤lk≤rk≤n1 \le l_k \le r_k \le n, 0≤xk≤yk≤m0 \le x_k \le y_k \le m)가 주어진다.

입력 파일에는 테스트 케이스가 하나만 있다.

출력

각 질의마다 답을 109+710^9 + 7로 나눈 나머지를 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    3 1 1
    8 1 6
    2 3 2
    2 2 0 0
    
    예상 출력
    1
    
  2. 예제 2

    입력
    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