|
8328 | 8328 | <ul class="metadata page-metadata" data-bi-name="page info" lang="en-us" dir="ltr"> |
8329 | 8329 |
|
8330 | 8330 | Last update: |
8331 | | - <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="December 6, 2025 07:27:49 UTC">December 6, 2025</span>  |
| 8331 | + <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="December 6, 2025 09:38:49 UTC">December 6, 2025</span>  |
8332 | 8332 |
|
8333 | 8333 | <!-- Tags --> |
8334 | 8334 |
|
@@ -8483,11 +8483,9 @@ <h3 id="finding-sum-in-one-dimensional-array">Finding sum in one-dimensional arr |
8483 | 8483 | This is handled in the <code>sum(int l, int r)</code> method.</p> |
8484 | 8484 | <p>Also this implementation supports two constructors. |
8485 | 8485 | You can create a Fenwick tree initialized with zeros, or you can convert an existing array into the Fenwick form.</p> |
8486 | | -<div class="tabbed-set tabbed-alternate" data-tabs="2:1"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">C++</label></div> |
| 8486 | +<div class="tabbed-set tabbed-alternate" data-tabs="2:2"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">C++</label><label for="__tabbed_2_2">Python</label></div> |
8487 | 8487 | <div class="tabbed-content"> |
8488 | | -<div class="tabbed-block"></div> |
8489 | | -</div> |
8490 | | -</div> |
| 8488 | +<div class="tabbed-block"> |
8491 | 8489 | <div class="highlight"><pre><span></span><code><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">FenwickTree</span><span class="w"> </span><span class="p">{</span> |
8492 | 8490 | <span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">bit</span><span class="p">;</span><span class="w"> </span><span class="c1">// binary indexed tree</span> |
8493 | 8491 | <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">;</span> |
@@ -8519,8 +8517,7 @@ <h3 id="finding-sum-in-one-dimensional-array">Finding sum in one-dimensional arr |
8519 | 8517 | <span class="w"> </span><span class="p">}</span> |
8520 | 8518 | <span class="w"> </span><span class="p">};</span> |
8521 | 8519 | </code></pre></div> |
8522 | | -<div class="tabbed-set tabbed-alternate" data-tabs="3:1"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Python</label></div> |
8523 | | -<div class="tabbed-content"> |
| 8520 | +</div> |
8524 | 8521 | <div class="tabbed-block"> |
8525 | 8522 | <div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">FenwickTree</span><span class="p">:</span> |
8526 | 8523 |
|
@@ -8570,11 +8567,9 @@ <h3 id="finding-minimum-of-0-r-in-one-dimensional-array">Finding minimum of <spa |
8570 | 8567 | <p>It is obvious that there is no easy way of finding minimum of range <span class="arithmatex">$[l, r]$</span> using Fenwick tree, as Fenwick tree can only answer queries of type <span class="arithmatex">$[0, r]$</span>. |
8571 | 8568 | Additionally, each time a value is <code>update</code>'d, the new value has to be smaller than the current value. |
8572 | 8569 | Both significant limitations are because the <span class="arithmatex">$min$</span> operation together with the set of integers doesn't form a group, as there are no inverse elements.</p> |
8573 | | -<div class="tabbed-set tabbed-alternate" data-tabs="4:1"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">C++</label></div> |
| 8570 | +<div class="tabbed-set tabbed-alternate" data-tabs="3:2"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">C++</label><label for="__tabbed_3_2">Python</label></div> |
8574 | 8571 | <div class="tabbed-content"> |
8575 | | -<div class="tabbed-block"></div> |
8576 | | -</div> |
8577 | | -</div> |
| 8572 | +<div class="tabbed-block"> |
8578 | 8573 | <div class="highlight"><pre><span></span><code><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">FenwickTreeMin</span><span class="w"> </span><span class="p">{</span> |
8579 | 8574 | <span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">bit</span><span class="p">;</span> |
8580 | 8575 | <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">;</span> |
@@ -8603,8 +8598,7 @@ <h3 id="finding-minimum-of-0-r-in-one-dimensional-array">Finding minimum of <spa |
8603 | 8598 | <span class="w"> </span><span class="p">}</span> |
8604 | 8599 | <span class="w"> </span><span class="p">};</span> |
8605 | 8600 | </code></pre></div> |
8606 | | -<div class="tabbed-set tabbed-alternate" data-tabs="5:1"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">Python</label></div> |
8607 | | -<div class="tabbed-content"> |
| 8601 | +</div> |
8608 | 8602 | <div class="tabbed-block"> |
8609 | 8603 | <div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">FenwickTreeMin</span><span class="p">:</span> |
8610 | 8604 |
|
@@ -8643,7 +8637,7 @@ <h3 id="finding-minimum-of-0-r-in-one-dimensional-array">Finding minimum of <spa |
8643 | 8637 | The implementation is also a lot harder compared to the normal implementation for sums.</p> |
8644 | 8638 | <h3 id="finding-sum-in-two-dimensional-array">Finding sum in two-dimensional array<a class="headerlink" href="#finding-sum-in-two-dimensional-array" title="Permanent link">¶</a></h3> |
8645 | 8639 | <p>As claimed before, it is very easy to implement Fenwick Tree for multidimensional array.</p> |
8646 | | -<div class="tabbed-set tabbed-alternate" data-tabs="6:2"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio" /><input id="__tabbed_6_2" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="__tabbed_6_1">C++</label><label for="__tabbed_6_2">Python</label></div> |
| 8640 | +<div class="tabbed-set tabbed-alternate" data-tabs="4:2"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">C++</label><label for="__tabbed_4_2">Python</label></div> |
8647 | 8641 | <div class="tabbed-content"> |
8648 | 8642 | <div class="tabbed-block"> |
8649 | 8643 | <div class="highlight"><pre><span></span><code><span class="k">struct</span><span class="w"> </span><span class="nc">FenwickTree2D</span><span class="w"> </span><span class="p">{</span> |
@@ -8703,7 +8697,7 @@ <h3 id="one-based-indexing-approach">One-based indexing approach<a class="header |
8703 | 8697 | <p>For this approach we change the requirements and definition for <span class="arithmatex">$T[]$</span> and <span class="arithmatex">$g()$</span> a little bit. |
8704 | 8698 | We want <span class="arithmatex">$T[i]$</span> to store the sum of <span class="arithmatex">$[g(i)+1; i]$</span>. |
8705 | 8699 | This changes the implementation a little bit, and allows for a similar nice definition for <span class="arithmatex">$g(i)$</span>:</p> |
8706 | | -<div class="tabbed-set tabbed-alternate" data-tabs="7:2"><input checked="checked" id="__tabbed_7_1" name="__tabbed_7" type="radio" /><input id="__tabbed_7_2" name="__tabbed_7" type="radio" /><div class="tabbed-labels"><label for="__tabbed_7_1">C++</label><label for="__tabbed_7_2">Python</label></div> |
| 8700 | +<div class="tabbed-set tabbed-alternate" data-tabs="5:2"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">C++</label><label for="__tabbed_5_2">Python</label></div> |
8707 | 8701 | <div class="tabbed-content"> |
8708 | 8702 | <div class="tabbed-block"> |
8709 | 8703 | <div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
@@ -8752,7 +8746,7 @@ <h3 id="one-based-indexing-approach">One-based indexing approach<a class="header |
8752 | 8746 | <div class="arithmatex">$$h(i) = i + (i ~\&~ (-i)).$$</div> |
8753 | 8747 | <p>As you can see, the main benefit of this approach is that the binary operations complement each other very nicely.</p> |
8754 | 8748 | <p>The following implementation can be used like the other implementations, however it uses one-based indexing internally.</p> |
8755 | | -<div class="tabbed-set tabbed-alternate" data-tabs="8:2"><input checked="checked" id="__tabbed_8_1" name="__tabbed_8" type="radio" /><input id="__tabbed_8_2" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="__tabbed_8_1">C++</label><label for="__tabbed_8_2">Python</label></div> |
| 8749 | +<div class="tabbed-set tabbed-alternate" data-tabs="6:2"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio" /><input id="__tabbed_6_2" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="__tabbed_6_1">C++</label><label for="__tabbed_6_2">Python</label></div> |
8756 | 8750 | <div class="tabbed-content"> |
8757 | 8751 | <div class="tabbed-block"> |
8758 | 8752 | <div class="highlight"><pre><span></span><code><span class="k">struct</span><span class="w"> </span><span class="nc">FenwickTreeOneBasedIndexing</span><span class="w"> </span><span class="p">{</span> |
@@ -8839,7 +8833,7 @@ <h3 id="2-range-update-and-point-query">2. Range Update and Point Query<a class= |
8839 | 8833 | If <span class="arithmatex">$i \in [l, r]$</span>, then we get the answer <span class="arithmatex">$x$</span> because of the first update operation. |
8840 | 8834 | And if <span class="arithmatex">$i > r$</span>, then the second update operation will cancel the effect of first one.</p> |
8841 | 8835 | <p>The following implementation uses one-based indexing.</p> |
8842 | | -<div class="tabbed-set tabbed-alternate" data-tabs="9:2"><input checked="checked" id="__tabbed_9_1" name="__tabbed_9" type="radio" /><input id="__tabbed_9_2" name="__tabbed_9" type="radio" /><div class="tabbed-labels"><label for="__tabbed_9_1">C++</label><label for="__tabbed_9_2">Python</label></div> |
| 8836 | +<div class="tabbed-set tabbed-alternate" data-tabs="7:2"><input checked="checked" id="__tabbed_7_1" name="__tabbed_7" type="radio" /><input id="__tabbed_7_2" name="__tabbed_7" type="radio" /><div class="tabbed-labels"><label for="__tabbed_7_1">C++</label><label for="__tabbed_7_2">Python</label></div> |
8843 | 8837 | <div class="tabbed-content"> |
8844 | 8838 | <div class="tabbed-block"> |
8845 | 8839 | <div class="highlight"><pre><span></span><code><span class="kt">void</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">idx</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
@@ -8887,7 +8881,7 @@ <h3 id="3-range-update-and-range-query">3. Range Update and Range Query<a class= |
8887 | 8881 | <p>Suppose that we want to increment the interval <span class="arithmatex">$[l, r]$</span> by the value <span class="arithmatex">$x$</span>. |
8888 | 8882 | Similarly as in the previous method, we perform two point updates on <span class="arithmatex">$B_1$</span>: <code>add(B1, l, x)</code> and <code>add(B1, r+1, -x)</code>. |
8889 | 8883 | And we also update <span class="arithmatex">$B_2$</span>. The details will be explained later.</p> |
8890 | | -<div class="tabbed-set tabbed-alternate" data-tabs="10:2"><input checked="checked" id="__tabbed_10_1" name="__tabbed_10" type="radio" /><input id="__tabbed_10_2" name="__tabbed_10" type="radio" /><div class="tabbed-labels"><label for="__tabbed_10_1">C++</label><label for="__tabbed_10_2">Python</label></div> |
| 8884 | +<div class="tabbed-set tabbed-alternate" data-tabs="8:2"><input checked="checked" id="__tabbed_8_1" name="__tabbed_8" type="radio" /><input id="__tabbed_8_2" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="__tabbed_8_1">C++</label><label for="__tabbed_8_2">Python</label></div> |
8891 | 8885 | <div class="tabbed-content"> |
8892 | 8886 | <div class="tabbed-block"> |
8893 | 8887 | <p>```cpp |
@@ -8931,7 +8925,7 @@ <h3 id="3-range-update-and-range-query">3. Range Update and Range Query<a class= |
8931 | 8925 | <p>The last expression is exactly equal to the required terms. |
8932 | 8926 | Thus we can use <span class="arithmatex">$B_2$</span> for shaving off extra terms when we multiply <span class="arithmatex">$B_1[i]\times i$</span>.</p> |
8933 | 8927 | <p>We can find arbitrary range sums by computing the prefix sums for <span class="arithmatex">$l-1$</span> and <span class="arithmatex">$r$</span> and taking the difference of them again.</p> |
8934 | | -<div class="tabbed-set tabbed-alternate" data-tabs="11:2"><input checked="checked" id="__tabbed_11_1" name="__tabbed_11" type="radio" /><input id="__tabbed_11_2" name="__tabbed_11" type="radio" /><div class="tabbed-labels"><label for="__tabbed_11_1">C++</label><label for="__tabbed_11_2">Python</label></div> |
| 8928 | +<div class="tabbed-set tabbed-alternate" data-tabs="9:2"><input checked="checked" id="__tabbed_9_1" name="__tabbed_9" type="radio" /><input id="__tabbed_9_2" name="__tabbed_9" type="radio" /><div class="tabbed-labels"><label for="__tabbed_9_1">C++</label><label for="__tabbed_9_2">Python</label></div> |
8935 | 8929 | <div class="tabbed-content"> |
8936 | 8930 | <div class="tabbed-block"> |
8937 | 8931 | <div class="highlight"><pre><span></span><code><span class="kt">void</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">idx</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> |
|
0 commit comments