Skip to content

Commit 075c857

Browse files
authored
chore(formatting): apply code formatting for range query
1 parent 03f2e44 commit 075c857

8 files changed

+294
-289
lines changed
Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
template<typename T>
2-
struct Data {
1+
template <typename T> struct Data {
32
// set default values
43
T sum = 0;
54
T mx = 0;
@@ -16,92 +15,95 @@ struct Data {
1615
}
1716
};
1817

19-
template<typename T>
20-
class NodeST {
21-
public:
18+
template <typename T> class NodeST {
19+
public:
2220
NodeST<T> *left, *right;
2321
int low, high;
2422
Data<T> data;
2523
NodeST() : left(NULL), right(NULL), data(Data<T>()) {}
2624
NodeST(Data<T> v) : left(NULL), right(NULL), data(v) {}
27-
NodeST(NodeST* l, NodeST* r, Data<T> v) : left(l), right(r), data(v) {}
25+
NodeST(NodeST *l, NodeST *r, Data<T> v) : left(l), right(r), data(v) {}
2826
};
2927

30-
template<typename T>
31-
class PersistentSegmentTree {
32-
public:
33-
void build(NodeST<T>* node, const vector<T> &v, int low, int high) {
34-
if (low == high) return node->data.apply(low, v[low]);
35-
int mid = low + (high - low)/2;
36-
node->left = new NodeST<T>();
37-
node->right = new NodeST<T>();
38-
build(node->left, v, low, mid);
39-
build(node->right, v, mid+1, high);
28+
template <typename T> class PersistentSegmentTree {
29+
public:
30+
void build(NodeST<T> *node, const vector<T> &v, int low, int high) {
31+
if (low == high)
32+
return node->data.apply(low, v[low]);
33+
int mid = low + (high - low) / 2;
34+
node->left = new NodeST<T>();
35+
node->right = new NodeST<T>();
36+
build(node->left, v, low, mid);
37+
build(node->right, v, mid + 1, high);
4038
pull(node);
4139
}
4240
inline Data<T> unite(const Data<T> &a, const Data<T> &b) {
4341
Data<T> res;
4442
res.sum = a.sum + b.sum;
4543
res.mx = max(a.mx, b.mx);
4644
res.mn = min(a.mn, b.mn);
47-
res.idx_mn = (res.mn == a.mn? a.idx_mn: b.idx_mn);
48-
res.idx_mx = (res.mx == a.mx? a.idx_mx: b.idx_mx);
45+
res.idx_mn = (res.mn == a.mn ? a.idx_mn : b.idx_mn);
46+
res.idx_mx = (res.mx == a.mx ? a.idx_mx : b.idx_mx);
4947
return res;
5048
}
5149
inline void pull(NodeST<T> *node) {
5250
node->data = unite(node->left->data, node->right->data);
5351
}
54-
void upgrade(NodeST<T>* prev, NodeST<T>* current, int low, int high, int idx, int value) {
55-
if (idx > high || idx < low || low > high) return;
56-
if (low == high) return current->data.apply(low, value);
57-
int mid = low + (high - low)/2;
58-
if (idx <= mid) {
59-
current->right = prev->right;
60-
current->left = new NodeST<T>(prev->left->data);
61-
upgrade(prev->left, current->left, low, mid, idx, value);
62-
} else {
63-
current->left = prev->left;
64-
current->right = new NodeST<T>(prev->right->data);
65-
upgrade(prev->right, current->right, mid+1, high, idx, value);
66-
}
52+
void upgrade(NodeST<T> *prev, NodeST<T> *current, int low, int high,
53+
int idx, int value) {
54+
if (idx > high || idx < low || low > high)
55+
return;
56+
if (low == high)
57+
return current->data.apply(low, value);
58+
int mid = low + (high - low) / 2;
59+
if (idx <= mid) {
60+
current->right = prev->right;
61+
current->left = new NodeST<T>(prev->left->data);
62+
upgrade(prev->left, current->left, low, mid, idx, value);
63+
} else {
64+
current->left = prev->left;
65+
current->right = new NodeST<T>(prev->right->data);
66+
upgrade(prev->right, current->right, mid + 1, high, idx, value);
67+
}
6768
pull(current);
6869
}
69-
Data<T> query(NodeST<T>* node, int low, int high, int left, int right) {
70-
if (left > high || right < low || low > high) return Data<T>{};
71-
if (left <= low && high <= right) return node->data;
72-
int mid = low + (high - low)/2;
73-
Data<T> p1 = query(node->left, low, mid, left, right);
74-
Data<T> p2 = query(node->right, mid+1, high, left, right);
75-
return unite(p1, p2);
70+
Data<T> query(NodeST<T> *node, int low, int high, int left, int right) {
71+
if (left > high || right < low || low > high)
72+
return Data<T>{};
73+
if (left <= low && high <= right)
74+
return node->data;
75+
int mid = low + (high - low) / 2;
76+
Data<T> p1 = query(node->left, low, mid, left, right);
77+
Data<T> p2 = query(node->right, mid + 1, high, left, right);
78+
return unite(p1, p2);
7679
}
7780

7881
int sz;
7982
vector<NodeST<T> *> version;
80-
83+
8184
PersistentSegmentTree(const vector<T> &v) {
82-
sz = (int) v.size();
85+
sz = (int)v.size();
8386
version.push_back(new NodeST<T>());
84-
build(version.back(), v, 0, sz - 1);
87+
build(version.back(), v, 0, sz - 1);
8588
}
8689
void modify(int from, int to, int idx, T value) {
87-
int n = (int) version.size();
90+
int n = (int)version.size();
8891
assert(0 <= from && from < n && 0 <= to && to < n);
89-
upgrade(version[from], version[to], 0, sz-1, idx, value);
92+
upgrade(version[from], version[to], 0, sz - 1, idx, value);
9093
}
9194
int modify(int from, int idx, T value) {
92-
int n = (int) version.size();
95+
int n = (int)version.size();
9396
assert(0 <= from && from < n);
9497
version.push_back(new NodeST<T>());
95-
upgrade(version[from], version.back(), 0, sz-1, idx, value);
96-
return (int) version.size() - 1;
98+
upgrade(version[from], version.back(), 0, sz - 1, idx, value);
99+
return (int)version.size() - 1;
97100
}
98101
Data<T> query(int from, int low, int high) {
99-
int n = (int) version.size();
102+
int n = (int)version.size();
100103
assert(0 <= from && from < n);
101104
assert(0 <= low && low < sz && 0 <= high && high < sz && low <= high);
102-
return query(version[from], 0, sz-1, low, high);
105+
return query(version[from], 0, sz - 1, low, high);
103106
}
104107
};
105108

106-
template<typename T>
107-
using persist_segtree = PersistentSegmentTree<T>;
109+
template <typename T> using persist_segtree = PersistentSegmentTree<T>;
Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,48 @@
1-
template <typename T, class F = function<T(const T&, const T&)>>
1+
template <typename T, class F = function<T(const T &, const T &)>>
22
class SegmentTree {
33
T NEUTRAL;
44
int n;
55
vector<T> tree;
66
F func;
7-
public:
8-
9-
SegmentTree(const vector<T> &values, T neutral, const F& f) : func(f) {
7+
8+
public:
9+
SegmentTree(const vector<T> &values, T neutral, const F &f) : func(f) {
1010
NEUTRAL = neutral;
1111
n = values.size();
12-
tree.resize(n*2);
12+
tree.resize(n * 2);
1313
// Build
14-
for (int i=0; i < n; i++) {
15-
tree[n+i] = values[i];
14+
for (int i = 0; i < n; i++) {
15+
tree[n + i] = values[i];
1616
}
1717
for (int i = n - 1; i > 0; --i) {
18-
tree[i] = func(tree[i*2], tree[i*2+1]);
18+
tree[i] = func(tree[i * 2], tree[i * 2 + 1]);
1919
}
2020
}
21-
21+
2222
void modify(int index, T value) {
23-
tree[index+n] = value;
23+
tree[index + n] = value;
2424
index = index + n;
25-
for (int i = index; i > 1; i >>= 1){
26-
tree[i/2] = func(tree[i], tree[i^1]);
25+
for (int i = index; i > 1; i >>= 1) {
26+
tree[i / 2] = func(tree[i], tree[i ^ 1]);
2727
}
2828
}
29-
29+
3030
T query(int l, int r) {
3131
T ans = NEUTRAL;
3232
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
33-
if (l&1) {
33+
if (l & 1) {
3434
ans = func(ans, tree[l++]);
3535
}
36-
if (r&1) {
36+
if (r & 1) {
3737
ans = func(ans, tree[--r]);
3838
}
3939
}
4040
return ans;
4141
}
4242
};
43-
template<typename T>
44-
using segtree = SegmentTree<T>;
43+
template <typename T> using segtree = SegmentTree<T>;
4544
// usage:
4645
// auto func = [&](int i, int j) -> int { return max(i, j); };
4746
// segtree<int, decltype(func)> st(values, -oo, func);
4847
// or:
49-
// segtree<int> st(values, -oo, [&](int x, int y) -> int {return max(x, y);});
48+
// segtree<int> st(values, -oo, [&](int x, int y) -> int {return max(x, y);});

range_query/range_query_segment_tree_lazy_compress.cpp

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
template<typename T>
2-
class SegmentTree {
3-
public:
4-
1+
template <typename T> class SegmentTree {
2+
public:
53
static const T lazy_neutral = static_cast<T>(0);
6-
4+
75
struct Node {
86
// don't forget to set default value (used for leaves)
97
// not necessarily neutral element!
@@ -13,32 +11,32 @@ class SegmentTree {
1311
T sum = static_cast<T>(...);
1412
int idx_mn = -1;
1513
int idx_mx = -1;
16-
14+
1715
bool changed = false;
18-
16+
1917
void apply(int left, int right, T value) {
2018
lazy = value;
2119
mx = value;
2220
mn = value;
2321
sum = (right - left + 1) * value;
24-
if(left == right) {
22+
if (left == right) {
2523
idx_mn = left;
2624
idx_mx = left;
2725
}
2826
changed = true;
2927
}
3028
};
31-
29+
3230
Node unite(const Node &a, const Node &b) const {
3331
Node res;
3432
res.sum = a.sum + b.sum;
3533
res.mx = max(a.mx, b.mx);
3634
res.mn = min(a.mn, b.mn);
37-
res.idx_mn = (res.mn == a.mn? a.idx_mn: b.idx_mn);
38-
res.idx_mx = (res.mx == a.mx? a.idx_mx: b.idx_mx);
35+
res.idx_mn = (res.mn == a.mn ? a.idx_mn : b.idx_mn);
36+
res.idx_mx = (res.mx == a.mx ? a.idx_mx : b.idx_mx);
3937
return res;
4038
}
41-
39+
4240
inline void push(int x, int left, int right) {
4341
int y = (left + right) >> 1;
4442
int z = x + ((y - left + 1) << 1);
@@ -49,23 +47,22 @@ class SegmentTree {
4947
tree[x].lazy = lazy_neutral;
5048
}
5149
}
52-
53-
inline void pull(int x, int z) {
54-
tree[x] = unite(tree[x + 1], tree[z]);
55-
}
56-
50+
51+
inline void pull(int x, int z) { tree[x] = unite(tree[x + 1], tree[z]); }
52+
5753
int n;
5854
vector<Node> tree;
59-
55+
6056
void build(int x, int left, int right) {
61-
if (left == right) return;
57+
if (left == right)
58+
return;
6259
int y = (left + right) >> 1;
6360
int z = x + ((y - left + 1) << 1);
6461
build(x + 1, left, y);
6562
build(z, y + 1, right);
6663
pull(x, z);
6764
}
68-
65+
6966
template <typename M>
7067
void build(int x, int left, int right, const vector<M> &v) {
7168
if (left == right) {
@@ -78,9 +75,10 @@ class SegmentTree {
7875
build(z, y + 1, right, v);
7976
pull(x, z);
8077
}
81-
78+
8279
Node query(int x, int from, int to, int left, int right) {
83-
if (left <= from && to <= right) return tree[x];
80+
if (left <= from && to <= right)
81+
return tree[x];
8482
int y = (from + to) >> 1;
8583
int z = x + ((y - from + 1) << 1);
8684
push(x, from, to);
@@ -91,15 +89,16 @@ class SegmentTree {
9189
if (left > y) {
9290
res = query(z, y + 1, to, left, right);
9391
} else {
94-
res = unite(query(x + 1, from, y, left, right), query(z, y + 1, to, left, right));
92+
res = unite(query(x + 1, from, y, left, right),
93+
query(z, y + 1, to, left, right));
9594
}
9695
}
9796
pull(x, z);
9897
return res;
9998
}
100-
99+
101100
template <typename... M>
102-
void modify(int x, int from, int to, int left, int right, const M&... v) {
101+
void modify(int x, int from, int to, int left, int right, const M &...v) {
103102
if (left <= from && to <= right) {
104103
tree[x].apply(from, to, v...);
105104
return;
@@ -115,42 +114,39 @@ class SegmentTree {
115114
}
116115
pull(x, z);
117116
}
118-
117+
119118
SegmentTree(int _n) : n(_n) {
120119
assert(n > 0);
121120
tree.resize(2 * n - 1);
122121
build(0, 0, n - 1);
123122
}
124-
123+
125124
SegmentTree(const vector<T> &v) {
126125
n = v.size();
127126
assert(n > 0);
128127
tree.resize(2 * n - 1);
129128
build(0, 0, n - 1, v);
130129
}
131-
130+
132131
Node query(int left, int right) {
133132
assert(0 <= left && left <= right && right <= n - 1);
134133
return query(0, 0, n - 1, left, right);
135134
}
136-
135+
137136
Node query(int idx) {
138137
assert(0 <= idx && idx <= n - 1);
139138
return query(0, 0, n - 1, idx, idx);
140139
}
141-
142-
template <typename... M>
143-
void modify(int left, int right, const M&... v) {
140+
141+
template <typename... M> void modify(int left, int right, const M &...v) {
144142
assert(0 <= left && left <= right && right <= n - 1);
145143
modify(0, 0, n - 1, left, right, v...);
146144
}
147145
};
148-
template<typename T>
149-
using segtree = SegmentTree<T>;
146+
template <typename T> using segtree = SegmentTree<T>;
147+
148+
template <typename T> using Node = typename SegmentTree<T>::Node;
150149

151-
template<typename T>
152-
using Node = typename SegmentTree<T>::Node;
153-
154150
// Usage:
155151
// segtree<int> st(n);
156152
// st.modify(l, r, val);

0 commit comments

Comments
 (0)