Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct segtree {
- struct node {
- int v, d = -1;
- };
- vector <node> tree;
- void init(const vector <int>& v) {
- tree.resize(2 * R);
- FOR1(0, v.size()) tree[R + i].v = v[i];
- RFOR(R - 1, 1) tree[l].v = tree[l * 2].v + tree[l * 2 + 1].v;
- }
- int cnt(int len, int node) {
- if (tree[node].d == 0) return len - tree[node].v;
- if (tree[node].d == 1) return tree[node].v;
- if (tree[node].d == 2) return 0;
- if (tree[node].d == 3) return len;
- }
- void push(int node, int len) {
- if (tree[node].d == -1) return;
- tree[node * 2].d = tree[node].d;
- tree[node * 2].v = cnt(len >> 1, node * 2);
- tree[node * 2 + 1].d = tree[node].d;
- tree[node * 2 + 1].v = cnt(len >> 1, node * 2 + 1);
- tree[node].d = -1;
- }
- void upd(int ql, int qr, int val, int node = 1, int nl = 0, int nr = R) {
- if (qr <= nl || nr <= ql) return;
- if (ql <= nl && nr <= qr) {
- tree[node].d = val;
- tree[node].v = cnt(nr - nl, node);
- return;
- }
- push(node, nr - nl);
- int nm = (nl + nr) >> 1;
- upd(ql, qr, val, node * 2, nl, nm);
- upd(ql, qr, val, node * 2 + 1, nm, nr);
- tree[node].v = tree[node * 2].v + tree[node * 2 + 1].v;
- }
- int rsq(int ql, int qr, int node = 1, int nl = 0, int nr = R) {
- if (qr <= nl || nr <= ql) return 0;
- if (ql <= nl && nr <= qr) return tree[node].v;
- push(node, nr - nl);
- int nm = (nl + nr) >> 1;
- return rsq(ql, qr, node * 2, nl, nm) + rsq(ql, qr, node * 2 + 1, nm, nr);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement