# seg
```cpp=
#define Ls(x) x << 1
#define Rs(x) x << 1 | 1
int N = 1e5+5;
vector<int> segTree(4*N), lazy(4*N) , arr(N);
void build(int l, int r, int idx = 1){
if(l == r){
segTree[idx] = arr[l];
return;
}
int mid = (l+r) >> 1;
build(l, mid, Ls(idx));
build(mid+1, r, Rs(idx));
segTree[idx] = segTree[Ls(idx)]+ segTree[Rs(idx)];
}
void pushDown(int l, int r, int idx){
if(lazy[idx] == 0) return;
segTree[idx] += (r-l+1)*lazy[idx];
if(l != r) lazy[Ls(idx)] += lazy[idx],lazy[Rs(idx)] += lazy[idx];
lazy[idx] = 0;
}
void update(int l, int r, int ql, int qr, int val, int idx = 1){
pushDown(l, r, idx);
if(l > qr || r < ql) return;
if(l >= ql && r <= qr){
segTree[idx] += (r-l+1)*val;
if(l != r) lazy[Ls(idx)] += val, lazy[Rs(idx)] += val;
return;
}
int mid = (l+r) >> 1;
update(l, mid, ql, qr, val, Ls(idx));
update(mid+1, r, ql, qr, val, Rs(idx));
segTree[idx] = segTree[Ls(idx)]+ segTree[Rs(idx)];
}
int query(int l, int r, int ql, int qr, int idx = 1){
pushDown(l, r, idx);
if(l > qr || r < ql) return 0;
if(l >= ql && r <= qr) return segTree[idx];
int mid = (l+r) >> 1, sum = 0;
if(ql <= mid) sum += query(l, mid, ql, qr, Ls(idx));
if(qr > mid) sum += query(mid+1, r, ql, qr, Rs(idx));
return sum;
}
```