pub struct SegmentTreeMap<M>where
M: Monoid,{
n: usize,
seg: HashMap<usize, M::T>,
u: M::T,
}Fields§
§n: usize§seg: HashMap<usize, M::T>§u: M::TImplementations§
Source§impl<M> SegmentTreeMap<M>where
M: Monoid,
impl<M> SegmentTreeMap<M>where
M: Monoid,
pub fn new(n: usize) -> Self
Sourcefn get_ref(&self, k: usize) -> &M::T
fn get_ref(&self, k: usize) -> &M::T
Examples found in repository?
crates/competitive/src/data_structure/segment_tree_map.rs (line 66)
59 pub fn set(&mut self, k: usize, x: M::T) {
60 debug_assert!(k < self.n);
61 let mut k = k + self.n;
62 *self.seg.entry(k).or_insert(M::unit()) = x;
63 k /= 2;
64 while k > 0 {
65 *self.seg.entry(k).or_insert(M::unit()) =
66 M::operate(self.get_ref(2 * k), self.get_ref(2 * k + 1));
67 k /= 2;
68 }
69 }
70 pub fn update(&mut self, k: usize, x: M::T) {
71 debug_assert!(k < self.n);
72 let mut k = k + self.n;
73 let t = self.seg.entry(k).or_insert(M::unit());
74 *t = M::operate(t, &x);
75 k /= 2;
76 while k > 0 {
77 *self.seg.entry(k).or_insert(M::unit()) =
78 M::operate(self.get_ref(2 * k), self.get_ref(2 * k + 1));
79 k /= 2;
80 }
81 }
82 pub fn get(&self, k: usize) -> M::T {
83 debug_assert!(k < self.n);
84 self.seg.get(&(k + self.n)).cloned().unwrap_or_else(M::unit)
85 }
86 pub fn fold<R>(&self, range: R) -> M::T
87 where
88 R: RangeBounds<usize>,
89 {
90 let range = range.to_range();
91 debug_assert!(range.end <= self.n);
92 let mut l = range.start + self.n;
93 let mut r = range.end + self.n;
94 let mut vl = M::unit();
95 let mut vr = M::unit();
96 while l < r {
97 if l & 1 != 0 {
98 vl = M::operate(&vl, self.get_ref(l));
99 l += 1;
100 }
101 if r & 1 != 0 {
102 r -= 1;
103 vr = M::operate(self.get_ref(r), &vr);
104 }
105 l /= 2;
106 r /= 2;
107 }
108 M::operate(&vl, &vr)
109 }
110 fn bisect_perfect<F>(&self, mut pos: usize, mut acc: M::T, f: F) -> (usize, M::T)
111 where
112 F: Fn(&M::T) -> bool,
113 {
114 while pos < self.n {
115 pos <<= 1;
116 let nacc = M::operate(&acc, self.get_ref(pos));
117 if !f(&nacc) {
118 acc = nacc;
119 pos += 1;
120 }
121 }
122 (pos - self.n, acc)
123 }
124 fn rbisect_perfect<F>(&self, mut pos: usize, mut acc: M::T, f: F) -> (usize, M::T)
125 where
126 F: Fn(&M::T) -> bool,
127 {
128 while pos < self.n {
129 pos = pos * 2 + 1;
130 let nacc = M::operate(self.get_ref(pos), &acc);
131 if !f(&nacc) {
132 acc = nacc;
133 pos -= 1;
134 }
135 }
136 (pos - self.n, acc)
137 }
138 /// Returns the first index that satisfies a accumlative predicate.
139 pub fn position_acc<R, F>(&self, range: R, f: F) -> Option<usize>
140 where
141 R: RangeBounds<usize>,
142 F: Fn(&M::T) -> bool,
143 {
144 let range = range.to_range();
145 debug_assert!(range.end <= self.n);
146 let mut l = range.start + self.n;
147 let r = range.end + self.n;
148 let mut k = 0usize;
149 let mut acc = M::unit();
150 while l < r >> k {
151 if l & 1 != 0 {
152 let nacc = M::operate(&acc, self.get_ref(l));
153 if f(&nacc) {
154 return Some(self.bisect_perfect(l, acc, f).0);
155 }
156 acc = nacc;
157 l += 1;
158 }
159 l >>= 1;
160 k += 1;
161 }
162 for k in (0..k).rev() {
163 let r = r >> k;
164 if r & 1 != 0 {
165 let nacc = M::operate(&acc, self.get_ref(r - 1));
166 if f(&nacc) {
167 return Some(self.bisect_perfect(r - 1, acc, f).0);
168 }
169 acc = nacc;
170 }
171 }
172 None
173 }
174 /// Returns the last index that satisfies a accumlative predicate.
175 pub fn rposition_acc<R, F>(&self, range: R, f: F) -> Option<usize>
176 where
177 R: RangeBounds<usize>,
178 F: Fn(&M::T) -> bool,
179 {
180 let range = range.to_range();
181 debug_assert!(range.end <= self.n);
182 let mut l = range.start + self.n;
183 let mut r = range.end + self.n;
184 let mut c = 0usize;
185 let mut k = 0usize;
186 let mut acc = M::unit();
187 while l >> k < r {
188 c <<= 1;
189 if l & (1 << k) != 0 {
190 l += 1 << k;
191 c += 1;
192 }
193 if r & 1 != 0 {
194 r -= 1;
195 let nacc = M::operate(self.get_ref(r), &acc);
196 if f(&nacc) {
197 return Some(self.rbisect_perfect(r, acc, f).0);
198 }
199 acc = nacc;
200 }
201 r >>= 1;
202 k += 1;
203 }
204 for k in (0..k).rev() {
205 if c & 1 != 0 {
206 l -= 1 << k;
207 let l = l >> k;
208 let nacc = M::operate(self.get_ref(l), &acc);
209 if f(&nacc) {
210 return Some(self.rbisect_perfect(l, acc, f).0);
211 }
212 acc = nacc;
213 }
214 c >>= 1;
215 }
216 None
217 }pub fn set(&mut self, k: usize, x: M::T)
pub fn update(&mut self, k: usize, x: M::T)
pub fn get(&self, k: usize) -> M::T
pub fn fold<R>(&self, range: R) -> M::Twhere
R: RangeBounds<usize>,
Sourcefn bisect_perfect<F>(&self, pos: usize, acc: M::T, f: F) -> (usize, M::T)
fn bisect_perfect<F>(&self, pos: usize, acc: M::T, f: F) -> (usize, M::T)
Examples found in repository?
crates/competitive/src/data_structure/segment_tree_map.rs (line 154)
139 pub fn position_acc<R, F>(&self, range: R, f: F) -> Option<usize>
140 where
141 R: RangeBounds<usize>,
142 F: Fn(&M::T) -> bool,
143 {
144 let range = range.to_range();
145 debug_assert!(range.end <= self.n);
146 let mut l = range.start + self.n;
147 let r = range.end + self.n;
148 let mut k = 0usize;
149 let mut acc = M::unit();
150 while l < r >> k {
151 if l & 1 != 0 {
152 let nacc = M::operate(&acc, self.get_ref(l));
153 if f(&nacc) {
154 return Some(self.bisect_perfect(l, acc, f).0);
155 }
156 acc = nacc;
157 l += 1;
158 }
159 l >>= 1;
160 k += 1;
161 }
162 for k in (0..k).rev() {
163 let r = r >> k;
164 if r & 1 != 0 {
165 let nacc = M::operate(&acc, self.get_ref(r - 1));
166 if f(&nacc) {
167 return Some(self.bisect_perfect(r - 1, acc, f).0);
168 }
169 acc = nacc;
170 }
171 }
172 None
173 }Sourcefn rbisect_perfect<F>(&self, pos: usize, acc: M::T, f: F) -> (usize, M::T)
fn rbisect_perfect<F>(&self, pos: usize, acc: M::T, f: F) -> (usize, M::T)
Examples found in repository?
crates/competitive/src/data_structure/segment_tree_map.rs (line 197)
175 pub fn rposition_acc<R, F>(&self, range: R, f: F) -> Option<usize>
176 where
177 R: RangeBounds<usize>,
178 F: Fn(&M::T) -> bool,
179 {
180 let range = range.to_range();
181 debug_assert!(range.end <= self.n);
182 let mut l = range.start + self.n;
183 let mut r = range.end + self.n;
184 let mut c = 0usize;
185 let mut k = 0usize;
186 let mut acc = M::unit();
187 while l >> k < r {
188 c <<= 1;
189 if l & (1 << k) != 0 {
190 l += 1 << k;
191 c += 1;
192 }
193 if r & 1 != 0 {
194 r -= 1;
195 let nacc = M::operate(self.get_ref(r), &acc);
196 if f(&nacc) {
197 return Some(self.rbisect_perfect(r, acc, f).0);
198 }
199 acc = nacc;
200 }
201 r >>= 1;
202 k += 1;
203 }
204 for k in (0..k).rev() {
205 if c & 1 != 0 {
206 l -= 1 << k;
207 let l = l >> k;
208 let nacc = M::operate(self.get_ref(l), &acc);
209 if f(&nacc) {
210 return Some(self.rbisect_perfect(l, acc, f).0);
211 }
212 acc = nacc;
213 }
214 c >>= 1;
215 }
216 None
217 }Sourcepub fn position_acc<R, F>(&self, range: R, f: F) -> Option<usize>
pub fn position_acc<R, F>(&self, range: R, f: F) -> Option<usize>
Returns the first index that satisfies a accumlative predicate.
Sourcepub fn rposition_acc<R, F>(&self, range: R, f: F) -> Option<usize>
pub fn rposition_acc<R, F>(&self, range: R, f: F) -> Option<usize>
Returns the last index that satisfies a accumlative predicate.
Source§impl<M> SegmentTreeMap<M>where
M: AbelianMonoid,
impl<M> SegmentTreeMap<M>where
M: AbelianMonoid,
Trait Implementations§
Source§impl<M> Clone for SegmentTreeMap<M>where
M: Monoid,
impl<M> Clone for SegmentTreeMap<M>where
M: Monoid,
Auto Trait Implementations§
impl<M> Freeze for SegmentTreeMap<M>
impl<M> RefUnwindSafe for SegmentTreeMap<M>
impl<M> Send for SegmentTreeMap<M>
impl<M> Sync for SegmentTreeMap<M>
impl<M> Unpin for SegmentTreeMap<M>
impl<M> UnwindSafe for SegmentTreeMap<M>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more