Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define integer ll //change
- const integer INF = 3e18; // change
- const int N = (1 << 20); // we need just 4n + 10
- integer neutr = -INF, neutr2 = 0; //change(neutr and update neutr)
- integer f(integer a, integer b) // operation
- {
- return max(a, b); //change
- }
- void g(integer &a, integer b) // update operation
- {
- if (a == neutr2)
- a = b;
- else
- a += b; //change
- }
- struct Tree
- {
- integer t[N], psh[N], n;
- vector<integer> vec;
- Tree(int n):
- n(n) {}
- void build(int v, int l, int r)
- {
- if (l + 1 == r)
- {
- t[v] = vec[l];
- return;
- }
- int mid = ((r + l) >> 1);
- build((v << 1), l, mid);
- build(((v << 1) | 1), mid, r);
- t[v] = f(t[(v << 1)], t[((v << 1) | 1)]);
- }
- Tree(vector<integer> v)
- {
- vec = v;
- n = vec.size();
- build(1, 0, n);
- }
- void push(int v)
- {
- if (psh[v] != neutr2)
- {
- g(psh[(v << 1)], psh[v]);
- g(psh[((v << 1) | 1)], psh[v]);
- psh[v] = neutr2;
- }
- }
- void upd(int v, int l, int r, int ql, int qr, integer val)
- {
- if (ql >= r || l >= qr)
- return;
- push(v);
- if (ql <= l && r <= qr)
- {
- g(t[v], val);
- g(psh[v], val);
- return;
- }
- int mid = ((r + l) >> 1);
- upd((v << 1), l, mid, ql, qr, val);
- upd(((v << 1) | 1), mid, r, ql, qr, val);
- t[v] = f(t[(v << 1)], t[((v << 1) | 1)]);
- }
- void upd(int l, int r, integer val)
- {
- upd(1, 0, n, l, r, val);
- }
- integer find(int v, int l, int r, int ql, int qr)
- {
- if (ql >= r || l >= qr)
- return neutr;
- push(v);
- if (ql <= l && r <= qr)
- return t[v];
- int mid = ((r + l) >> 1);
- return f(find((v << 1), l, mid, ql, qr), find(((v << 1) | 1), mid, r, ql, qr));
- }
- integer find(int l, int r)
- {
- return find(1, 0, n, l, r);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement