Skip to content
This repository was archived by the owner on Apr 9, 2024. It is now read-only.

Commit 61466c5

Browse files
authored
Update LazySegmentTree.cpp
1 parent 45caed1 commit 61466c5

File tree

1 file changed

+50
-59
lines changed

1 file changed

+50
-59
lines changed

DataStructure/SegmentTree/LazySegmentTree.cpp

Lines changed: 50 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9,77 +9,68 @@
99

1010
template <class T>
1111
class LazySegmentTree {
12-
private:
13-
int n;
14-
vector<T> A, st, lazy;
12+
private:
13+
int n;
14+
const T neutral = 0; //Cambiar segun la operacion
15+
vector<T> A, st, lazy;
1516

16-
inline int l(int p) { return (p << 1) + 1; } // ir al hijo izquierdo
17-
inline int r(int p) { return (p << 1) + 2; } // ir al hijo derecho
17+
inline int l(int p) { return (p << 1) + 1; } // ir al hijo izquierdo
18+
inline int r(int p) { return (p << 1) + 2; } // ir al hijo derecho
1819

19-
void build(int index, int start, int end) {
20-
if (start == end) {
21-
st[index] = A[start];
22-
} else {
23-
int mid = (start + end) / 2;
24-
build(l(index), start, mid);
25-
build(r(index), mid + 1, end);
26-
st[index] = st[l(index)] + st[r(index)];
20+
//Cambiar segun la operacion
21+
T merge(T a, T b)
22+
{
23+
return a + b;
2724
}
28-
}
2925

30-
// Nota: Si se utiliza para el minimo o maximo de un rango no se le agrega el (end - start + 1)
31-
void propagate(int index, int start, int end) {
32-
if (lazy[index] != 0) {
33-
st[index] += (end - start + 1) * lazy[index];
34-
if (start != end) {
35-
lazy[l(index)] += lazy[index];
36-
lazy[r(index)] += lazy[index];
37-
}
38-
lazy[index] = 0;
26+
// Nota: Si se utiliza para el minimo o maximo de un rango no se le agrega el (end - start + 1)
27+
void propagate(int index, int start, int end, T dif) {
28+
st[index] += (end - start + 1) * dif;
29+
if (start != end) {
30+
lazy[l(index)] += dif;
31+
lazy[r(index)] += dif;
32+
}
33+
lazy[index] = 0;
3934
}
40-
}
4135

42-
void add(int index, int start, int end, int i, int j, T val) {
43-
propagate(index, start, end);
44-
if ((end < i) || (start > j))
45-
return;
36+
void add(int index, int start, int end, int i, int j, T val) {
37+
if(lazy[index]){
38+
propagate(index, start, end, lazy[index]);
39+
}
40+
41+
if ((end < i) || (start > j))
42+
return;
4643

47-
if (start >= i && end <= j) {
48-
st[index] += (end - start + 1) * val;
49-
if (start != end) {
50-
lazy[l(index)] += val;
51-
lazy[r(index)] += val;
52-
}
53-
return;
54-
}
55-
int mid = (start + end) / 2;
44+
if (start >= i && end <= j) {
45+
propagate(index, start, end, val);
46+
return;
47+
}
48+
int mid = (start + end) / 2;
5649

57-
add(l(index), start, mid, i, j, x);
58-
add(r(index), mid + 1, end, i, j, x);
50+
add(l(index), start, mid, i, j, val);
51+
add(r(index), mid + 1, end, i, j, val);
5952

60-
st[index] = (st[l(index)] + st[r(index)]);
61-
}
53+
st[index] = merge(st[l(index)], st[r(index)]);
54+
}
6255

63-
T query(int index, int start, int end, int i, int j) {
64-
propagate(index, start, end);
65-
if (end < i || start > j)
66-
return 0;
67-
if ((i <= start) && (end <= j))
68-
return st[index];
56+
T query(int index, int start, int end, int i, int j) {
57+
if(lazy[index]){
58+
propagate(index, start, end, lazy[index]);
59+
}
6960

70-
int mid = (start + end) / 2;
61+
if (end < i || start > j)
62+
return neutral;
63+
if ((i <= start) && (end <= j))
64+
return st[index];
7165

72-
return query(l(index), start, mid, i, j) + query(r(index), mid + 1, end, i, j);
73-
}
66+
int mid = (start + end) / 2;
7467

75-
public:
76-
LazySegmentTree(int sz) : n(sz), st(4 * n), lazy(4 * n) {}
68+
return merge(query(l(index), start, mid, i, j), query(r(index), mid + 1, end, i, j));
69+
}
7770

78-
LazySegmentTree(const vector<T> &initialA) : LazySegmentTree(SZ(initialA)) {
79-
A = initialA;
80-
build(0, 0, n - 1);
81-
}
82-
// [i, j]
83-
void add(int i, int j, T val) { add(0, 0, n - 1, i, j, val); } // [i, j]
84-
T query(int i, int j) { return query(0, 0, n - 1, i, j); } // [i, j]
71+
public:
72+
LazySegmentTree(int sz) : n(sz), st(4 * n), lazy(4 * n) {}
73+
// [i, j]
74+
void add(int i, int j, T val) { add(0, 0, n - 1, i, j, val); } // [i, j]
75+
T query(int i, int j) { return query(0, 0, n - 1, i, j); } // [i, j]
8576
};

0 commit comments

Comments
 (0)