1use crate::ops::{Commutative, Invertible};
2use crate::maybe_owned::MaybeOwned;
3
4use std::default::Default;
5use std::hash::{Hash, Hasher};
6
7pub struct PrefixPoint<N, O> where O: Commutative<N> {
98 buf: Vec<N>,
99 op: O
100}
101
102#[inline(always)]
104fn lsb(i: usize) -> usize {
105 i & (1 + !i)
106}
107
108#[inline(always)]
110unsafe fn combine_mut<N, O: Commutative<N>>(buf: &mut Vec<N>, i: usize, j: usize, op: &O) {
111 debug_assert!(i != j);
112 let ptr1 = &mut buf[i] as *mut N;
113 let ptr2 = &buf[j] as *const N;
114 op.combine_mut(&mut *ptr1, &*ptr2);
115}
116#[inline(always)]
118unsafe fn uncombine_mut<N, O: Invertible<N>>(buf: &mut Vec<N>, i: usize, j: usize, op: &O) {
119 debug_assert!(i != j);
120 let ptr1 = &mut buf[i] as *mut N;
121 let ptr2 = &buf[j] as *const N;
122 op.uncombine(&mut *ptr1, &*ptr2);
123}
124
125impl<N, O: Commutative<N>> PrefixPoint<N, O> {
126 pub fn build(mut buf: Vec<N>, op: O) -> PrefixPoint<N, O> {
129 let len = buf.len();
130 for i in 0..len {
131 let j = i + lsb(i+1);
132 if j < len {
133 unsafe {
134 combine_mut::<N, O>(&mut buf, j, i, &op);
135 }
136 }
137 }
138 PrefixPoint { buf: buf, op: op }
139 }
140 pub fn len(&self) -> usize {
143 self.buf.len()
144 }
145 #[inline]
148 pub fn query(&self, mut i: usize) -> N where N: Clone {
149 let mut sum = self.buf[i].clone();
150 i -= lsb(1+i) - 1;
151 while i > 0 {
152 sum = self.op.combine_left(sum, &self.buf[i-1]);
153 i -= lsb(i);
154 }
155 sum
156 }
157 #[inline]
160 pub fn query_noclone(&self, mut i: usize) -> MaybeOwned<N> {
161 let mut sum = MaybeOwned::Borrowed(&self.buf[i]);
162 i -= lsb(1+i) - 1;
163 while i > 0 {
164 sum = MaybeOwned::Owned(match sum {
165 MaybeOwned::Borrowed(ref v) => self.op.combine(v, &self.buf[i-1]),
166 MaybeOwned::Owned(v) => self.op.combine_left(v, &self.buf[i-1]),
167 });
168 i -= lsb(i);
169 }
170 sum
171 }
172 #[inline]
175 pub fn modify(&mut self, mut i: usize, delta: N) {
176 let len = self.len();
177 while i < len {
178 self.op.combine_mut(&mut self.buf[i], &delta);
179 i += lsb(i+1);
180 }
181 }
182 #[inline(always)]
185 pub fn truncate(&mut self, size: usize) {
186 self.buf.truncate(size);
187 }
188 #[inline(always)]
190 pub fn shrink_to_fit(&mut self) {
191 self.buf.shrink_to_fit();
192 }
193 #[inline]
198 pub fn map<F: FnMut(&mut N)>(&mut self, mut f: F) {
199 for val in &mut self.buf {
200 f(val);
201 }
202 }
203}
204impl<N, O: Commutative<N>> Extend<N> for PrefixPoint<N, O> {
205 fn extend<I: IntoIterator<Item=N>>(&mut self, values: I) {
208 let oldlen = self.len();
209 self.buf.extend(values);
210 let len = self.len();
211 for i in 0..len {
212 let j = i + lsb(i+1);
213 if oldlen <= j && j < len {
214 unsafe {
215 combine_mut::<N, O>(&mut self.buf, j, i, &self.op);
216 }
217 }
218 }
219 }
220}
221impl<N, O: Commutative<N> + Invertible<N>> PrefixPoint<N, O> {
222 pub fn get(&self, mut i: usize) -> N where N: Clone {
226 let mut sum = self.buf[i].clone();
227 let z = 1 + i - lsb(i+1);
228 while i != z {
229 self.op.uncombine(&mut sum, &self.buf[i-1]);
230 i -= lsb(i);
231 }
232 sum
233 }
234 pub fn set(&mut self, i: usize, mut value: N) where N: Clone {
237 let current = self.get(i);
238 self.op.uncombine(&mut value, ¤t);
239 self.modify(i, value);
240 }
241 pub fn unwrap(self) -> Vec<N> {
244 let mut buf = self.buf;
245 let len = buf.len();
246 for i in (0..len).rev() {
247 let j = i + lsb(i+1);
248 if j < len {
249 unsafe {
250 uncombine_mut::<N, O>(&mut buf, j, i, &self.op);
251 }
252 }
253 }
254 buf
255 }
256 pub fn unwrap_clone(&self) -> Vec<N> where N: Clone {
259 let len = self.buf.len();
260 let mut buf = self.buf.clone();
261 for i in (0..len).rev() {
262 let j = i + lsb(i+1);
263 if j < len {
264 unsafe {
265 uncombine_mut::<N, O>(&mut buf, j, i, &self.op);
266 }
267 }
268 }
269 buf
270 }
271}
272
273impl<N: Clone, O: Commutative<N> + Clone> Clone for PrefixPoint<N, O> {
274 fn clone(&self) -> PrefixPoint<N, O> {
275 PrefixPoint {
276 buf: self.buf.clone(), op: self.op.clone()
277 }
278 }
279}
280impl<N, O: Commutative<N> + Default> Default for PrefixPoint<N, O> {
281 #[inline]
282 fn default() -> PrefixPoint<N, O> {
283 PrefixPoint { buf: Vec::new(), op: Default::default() }
284 }
285}
286impl<'a, N: 'a + Hash, O: Commutative<N>> Hash for PrefixPoint<N, O> {
287 #[inline]
288 fn hash<H: Hasher>(&self, state: &mut H) {
289 self.buf.hash(state);
290 }
291}
292
293#[cfg(test)]
294mod tests {
295
296 pub fn compute_prefix_sum<N: ::std::ops::Add<Output=N> + Copy>(buf: &mut[N]) {
299 let mut iter = buf.iter_mut();
300 match iter.next() {
301 None => {},
302 Some(s) => {
303 let mut sum = *s;
304 for item in iter {
305 sum = sum + *item;
306 *item = sum;
307 }
308 }
309 }
310 }
311
312 use super::*;
313 use rand::distributions::Standard;
314 use rand::prelude::*;
315 use std::num::Wrapping;
316 use crate::ops::Add;
317
318 fn random_vec(rng: &mut ThreadRng, len: usize) -> Vec<Wrapping<i32>> {
319 rng.sample_iter(&Standard).map(|i| Wrapping(i)).take(len).collect()
320 }
321
322 #[test]
323 fn fenwick_query() {
324 let mut rng = thread_rng();
325 for n in 0..130 {
326 let mut vec = random_vec(&mut rng, n);
327 let fenwick = PrefixPoint::build(vec.clone(), Add);
328 compute_prefix_sum(&mut vec);
329 for i in 0..vec.len() {
330 assert_eq!(vec[i], fenwick.query(i));
331 assert_eq!(&vec[i], fenwick.query_noclone(i).borrow());
332 }
333 }
334 }
335 #[test]
336 fn fenwick_map() {
337 let mut rng = thread_rng();
338 for n in 0..130 {
339 let mut vec = random_vec(&mut rng, n);
340 let mut fenwick = PrefixPoint::build(vec.clone(), Add);
341 assert_eq!(fenwick.clone().unwrap(), vec);
342 assert_eq!(fenwick.clone().unwrap_clone(), vec);
343 compute_prefix_sum(&mut vec);
344 fenwick.map(|n| *n = Wrapping(12) * *n);
345 for i in 0..vec.len() {
346 assert_eq!(vec[i]*Wrapping(12), fenwick.query(i));
347 }
348 }
349 }
350 #[test]
351 fn fenwick_modify() {
352 let mut rng = thread_rng();
353 for n in 0..130 {
354 let mut vec = random_vec(&mut rng, n);
355 let diff = random_vec(&mut rng, n);
356 let mut fenwick = PrefixPoint::build(vec.clone(), Add);
357 for i in 0..diff.len() {
358 let mut ps: Vec<Wrapping<i32>> = vec.clone();
359 compute_prefix_sum(&mut ps);
360 assert_eq!(fenwick.clone().unwrap(), vec);
361 assert_eq!(fenwick.clone().unwrap_clone(), vec);
362 for j in 0..vec.len() {
363 assert_eq!(ps[j], fenwick.query(j));
364 assert_eq!(vec[j], fenwick.get(j));
365 }
366 vec[i] += diff[i];
367 fenwick.modify(i, diff[i]);
368 }
369 }
370 }
371 #[test]
372 fn fenwick_set() {
373 let mut rng = thread_rng();
374 for n in 0..130 {
375 let mut vec = random_vec(&mut rng, n);
376 let diff = random_vec(&mut rng, n);
377 let mut fenwick = PrefixPoint::build(vec.clone(), Add);
378 for i in 0..diff.len() {
379 let mut ps: Vec<Wrapping<i32>> = vec.clone();
380 compute_prefix_sum(&mut ps);
381 assert_eq!(fenwick.clone().unwrap(), vec);
382 assert_eq!(fenwick.clone().unwrap_clone(), vec);
383 for j in 0..vec.len() {
384 assert_eq!(ps[j], fenwick.query(j));
385 assert_eq!(vec[j], fenwick.get(j));
386 }
387 vec[i] = diff[i];
388 fenwick.set(i, diff[i]);
389 }
390 }
391 }
392 #[test]
393 fn fenwick_extend() {
394 let mut rng = thread_rng();
395 for n in 0..130 {
396 let vec = random_vec(&mut rng, n);
397 let mut sum = vec.clone();
398 compute_prefix_sum(&mut sum);
399 for i in 0..sum.len() {
400 let mut fenwick = PrefixPoint::build(vec.iter().take(i/2).map(|&i| i).collect(), Add);
401 fenwick.extend(vec.iter().skip(i/2).take(i - i/2).map(|&i| i));
402 for j in 0..i {
403 assert_eq!(sum[j], fenwick.query(j));
404 }
405 }
406 }
407 }
408}