Skip to content

Commit f65f65f

Browse files
authored
Merge pull request #63 from himkt/cleaning-segtree
refactor(tree): cleanup segment tree
2 parents 1b74352 + 7b99cd8 commit f65f65f

File tree

1 file changed

+20
-55
lines changed

1 file changed

+20
-55
lines changed

src/tree.rs

Lines changed: 20 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl SegmentTree {
5353
if let Mode::RangeUpdate(op) = &self.mode {
5454
let operator = match op {
5555
Op::Add => |ret: &mut i64, v: i64| *ret += v,
56-
_ => panic!(),
56+
_ => panic!("Operator {:?} is not supported.", op),
5757
};
5858

5959
operator(&mut ret, self.data[index]);
@@ -62,7 +62,7 @@ impl SegmentTree {
6262
operator(&mut ret, self.data[index]);
6363
}
6464
} else {
65-
panic!("Unsupported");
65+
panic!("Mode {:?} is not supported.", &self.mode);
6666
}
6767

6868
ret
@@ -80,84 +80,49 @@ impl SegmentTree {
8080
if qr <= sl || sr <= ql {
8181
return SegmentTree::default(op);
8282
}
83-
8483
if ql <= sl && sr <= qr {
8584
return self.data[pos];
8685
}
8786

88-
fn add(l: i64, r: i64) -> i64 {
89-
l + r
90-
}
91-
fn max(l: i64, r: i64) -> i64 {
92-
l.max(r)
93-
}
94-
fn min(l: i64, r: i64) -> i64 {
95-
l.min(r)
96-
}
97-
9887
let sm = (sl + sr) / 2;
9988
let lv = self.range_query_recursive(op, ql, qr, sl, sm, pos * 2);
10089
let rv = self.range_query_recursive(op, ql, qr, sm, sr, pos * 2 + 1);
101-
let operate = match op {
102-
Op::Add => add,
103-
Op::Max => max,
104-
Op::Min => min,
105-
};
106-
operate(lv, rv)
90+
match op {
91+
Op::Add => lv + rv,
92+
Op::Max => lv.max(rv),
93+
Op::Min => lv.min(rv),
94+
}
10795
}
10896

109-
/// Run a range query.
11097
pub fn get_range(&self, l: usize, r: usize) -> i64 {
11198
if let Mode::RangeGet(op) = &self.mode {
11299
self.range_query_recursive(op, l, r, 0, SegmentTree::SEQ_LEN, 1)
113100
} else {
114-
panic!("Unsupported");
101+
panic!("Mode {:?} is not supported.", &self.mode);
115102
}
116103
}
117104

118105
/// Update an i-th element to `value`.
119106
pub fn update_one(&mut self, mut index: usize, value: i64) {
120107
index += SegmentTree::SEQ_LEN;
121108

122-
fn add_assign_one(ret: &mut i64, v: i64) {
123-
*ret += v;
124-
}
125-
fn max_assign_one(ret: &mut i64, v: i64) {
126-
*ret = v;
127-
}
128-
fn min_assign_one(ret: &mut i64, v: i64) {
129-
*ret = v;
130-
}
131-
fn add_assign(ret: &mut i64, l: i64, r: i64) {
132-
*ret = l + r;
133-
}
134-
fn max_assign(ret: &mut i64, l: i64, r: i64) {
135-
*ret = l.max(r);
136-
}
137-
fn min_assign(ret: &mut i64, l: i64, r: i64) {
138-
*ret = l.min(r);
139-
}
140-
141109
if let Mode::RangeGet(op) = &self.mode {
142-
let operate_and_assign_one = match op {
143-
Op::Add => add_assign_one,
144-
Op::Max => max_assign_one,
145-
Op::Min => min_assign_one,
146-
};
147-
operate_and_assign_one(&mut self.data[index], value);
148-
149-
let operate_and_assign = match op {
150-
Op::Add => add_assign,
151-
Op::Max => max_assign,
152-
Op::Min => min_assign,
153-
};
154-
110+
match op {
111+
Op::Add => self.data[index] += value,
112+
_ => self.data[index] = value,
113+
}
155114
while index > 0 {
156115
index /= 2;
157116
let lv = self.data[index * 2];
158117
let rv = self.data[index * 2 + 1];
159-
operate_and_assign(&mut self.data[index], lv, rv);
118+
match op {
119+
Op::Add => self.data[index] = lv + rv,
120+
Op::Max => self.data[index] = lv.max(rv),
121+
Op::Min => self.data[index] = lv.min(rv),
122+
};
160123
}
124+
} else {
125+
panic!("Mode {:?} is not supported.", &self.mode);
161126
}
162127
}
163128

@@ -186,7 +151,7 @@ impl SegmentTree {
186151
r /= 2;
187152
}
188153
} else {
189-
panic!("Unsupported");
154+
panic!("Mode {:?} is not supported.", &self.mode);
190155
}
191156
}
192157
}

0 commit comments

Comments
 (0)