void update(int start, int end, int add) { update(start, end, 0, 0, n - 1, add); } void update(int s, int e, int node, int lo, int hi, int add) { if (st[node].mark)propagate(node, hi - lo + 1); if (lo > e || hi < s)return; if (s <= lo && e >= hi) { st[node].val += add; if (lo != hi) { st[2 * node + 1].mark += add; st[2 * node + 2].mark += add; } return; } int mid = lo + (hi - lo) / 2; update(s, e, 2 * node + 1, lo, mid, add); update(s, e, 2 * node + 2, mid + 1, hi, add); st[node].val = st[2 * node + 1].val + st[2 * node + 2].val; } void propagate(int node, int len) { st[node].val += len * st[node].mark; if (len != 1) { st[2 * node + 1].mark += st[node].mark; st[2 * node + 2].mark += st[node].mark; } st[node].mark = 0; } int sumQuery(int qlo, int qhi, int clo, int chi, int i) { if(st[i].mark)propagate(i, chi - clo + 1); if (qlo > chi || qhi < clo)return 0; if (qlo <= clo && qhi >= chi)return st[i].val; int mid = clo + (chi - clo) / 2; int res = sumQuery(qlo, qhi, clo, mid, 2 * i + 1) + sumQuery(qlo, qhi, mid + 1, chi, 2 * i + 2); }