|
|
/*
|
|
|
* Simple Fenwick tree implementation
|
|
|
* Additive and multiplicative modulo variants
|
|
|
* Author: Titouan Rigoudy
|
|
|
*/
|
|
|
|
|
|
long *fenwick_make(size_t n);
|
|
|
|
|
|
long *fenwick_prodmake(size_t n);
|
|
|
|
|
|
// Add val to element i in fenwick tree
|
|
|
void fenwick_update(long *fenwick, size_t n, size_t i, long val);
|
|
|
|
|
|
// Sum of elements in [0, i[
|
|
|
long fenwick_prefixsum(long *fenwick, size_t n, size_t i);
|
|
|
|
|
|
// Sum of elements in [i, j[
|
|
|
long fenwick_intervalsum(long *fenwick, size_t n, size_t i, size_t j);
|
|
|
|
|
|
// Multiply element i by val in fenwick tree of products
|
|
|
void fenwick_produpdate(long *fenwick, size_t n, size_t i, long val, long mod);
|
|
|
|
|
|
// Product of elements in [0, i[
|
|
|
long fenwick_prefixprod(long *fenwick, size_t n, size_t i, long mod);
|
|
|
|
|
|
// Product of elements in [i, j[
|
|
|
long fenwick_intervalprod(long *fen, size_t n, size_t i, size_t j, long mod);
|
|
|
|