Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct SegTree {
- int n;
- vector<int> a;
- vector<int> tree, add;
- SegTree(int n) {
- this->n = n;
- tree.resize(4 * n, 0);
- add.resize(4 * n, -1);
- a.resize(n, 0);
- build(0, 0, n);
- }
- void push(int v, int l, int r) {
- if (add[v] != -1 && l + 1 != r) {
- tree[v] = add[v];
- add[2 * v + 1] = add[v];
- add[2 * v + 2] = add[v];
- add[v] = -1;
- }
- }
- void build(int i, int l, int r) {
- add[i] = -1;
- if (l + 1 == r) {
- //tree[i] = a[l];
- tree[i] = 0;
- } else {
- int m = (l + r) / 2;
- build(2 * i + 1, l, m);
- build(2 * i + 2, m, r);
- tree[i] = (tree[i * 2 + 1] | tree[i * 2 + 2]);
- }
- }
- void _update(int i, int l, int r, int ql, int qr, int val) {
- if (qr <= l || ql >= r) {
- return;
- }
- if (ql <= l && qr >= r) {
- add[i] = val;
- push(i, l, r);
- } else {
- int m = (l + r) / 2;
- push(i, l, r);
- _update(i * 2 + 1, l, m, ql, qr, val);
- _update(i * 2 + 2, m, r, ql, qr, val);
- tree[i] = (tree[2 * i + 1] | tree[2 * i + 2]);
- }
- }
- int _get(int i, int l, int r, int ql, int qr) {
- if (qr <= l || ql >= r) {
- return 0;
- }
- push(i, l, r);
- if (ql <= l && qr >= r) {
- return tree[i];
- }
- int m = (l + r) / 2;
- return (_get(2 * i + 1, l, m, ql, qr) | _get(2 * i + 2, m, r, ql, qr));
- }
- int get(int ql, int qr) {
- return _get(0, 0, n, ql, qr);
- }
- void update(int ql, int qr, int val) {
- _update(0, 0, n, ql, qr, val);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement