Lazy Segment Tree
구간 합 레이지 세그
// SZ: N보다 크거나 같은 2^k 꼴의 수
// 13만 -> 1 << 17 (131072), 26만 -> 1 << 18 (262144)
// 52만 -> 1 << 19 (524288), 100만 -> 1 << 20 (1048576)
constexpr int SZ = 1 << 20;
ll T[SZ<<1], L[SZ<<1];
void Push(int node, int s, int e){
if(L[node] == 0) return;
T[node] += (e - s + 1) * L[node];
if(s != e) L[node*2] += L[node], L[node*2+1] += L[node];
L[node] = 0;
}
// [l, r]번째 수에 v를 더함, 0 <= l <= r < SZ
void RangeAdd(int l, int r, ll v, int node=1, int s=0, int e=SZ-1){
Push(node, s, e);
if(r < s || e < l) return;
if(l <= s && e <= r){ L[node] += v; Push(node, s, e); return; }
int m = (s + e) / 2;
RangeAdd(l, r, v, node*2, s, m);
RangeAdd(l, r, v, node*2+1, m+1, e);
T[node] = T[node*2] + T[node*2+1];
}
// [l, r]번째 수의 합을 구함
ll RangeSum(int l, int r, int node=1, int s=0, int e=SZ-1){
Push(node, s, e);
if(r < s || e < l) return 0;
if(l <= s && e <= r) return T[node];
int m = (s + e) / 2;
return RangeSum(l, r, node*2, s, m) + RangeSum(l, r, node*2+1, m+1, e);
}