const long long N = 2 * 1e5 + 2; long long tree[4 * N], v[N]; void build(long long node, long long st, long long e) { if (st == e) { tree[node] = v[st]; return; } long long mid = (st + e) / 2; build(2 * node, st, mid); build(2 * node + 1, mid + 1, e); tree[node] = tree[2 * node] + tree[2 * node + 1]; } long long query(long long node, long long st, long long e, long long l, long long r) { if (l > e || r < st) return 0; if (l <= st && r >= e) return tree[node]; long long mid = (st + e) / 2; long long left = query(2 * node, st, mid, l, r); long long right = query(2 * node + 1, mid + 1, e, l, r); return left + right; } void update(long long node, long long st, long long e, long long ind, long long val) { if (st == e) { v[st] = val; tree[node] = val; return; } long long mid = (st + e) / 2; if (ind <= mid) { update(2 * node, st, mid, ind, val); } else { update(2 * node + 1, mid + 1, e, ind, val); } tree[node] = (tree[2 * node] + tree[2 * node + 1]); }