<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ta.in.th/index.php?action=history&amp;feed=atom&amp;title=Fenwick_Tree</id>
	<title>Fenwick Tree - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ta.in.th/index.php?action=history&amp;feed=atom&amp;title=Fenwick_Tree"/>
	<link rel="alternate" type="text/html" href="https://wiki.ta.in.th/index.php?title=Fenwick_Tree&amp;action=history"/>
	<updated>2026-06-16T22:59:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0-alpha</generator>
	<entry>
		<id>https://wiki.ta.in.th/index.php?title=Fenwick_Tree&amp;diff=32&amp;oldid=prev</id>
		<title>Tata: Created page with &quot;* เอามาจาก wiki.acioi.in.th '''Fenwick Tree''' หรือ '''Binary Index Tree'''  * ใช้แก้ปัญหาที่ว่า  &quot;ถ้าต้อ...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.ta.in.th/index.php?title=Fenwick_Tree&amp;diff=32&amp;oldid=prev"/>
		<updated>2019-03-06T17:22:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;* เอามาจาก wiki.acioi.in.th &amp;#039;&amp;#039;&amp;#039;Fenwick Tree&amp;#039;&amp;#039;&amp;#039; หรือ &amp;#039;&amp;#039;&amp;#039;Binary Index Tree&amp;#039;&amp;#039;&amp;#039;  * ใช้แก้ปัญหาที่ว่า  &amp;quot;ถ้าต้อ...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;* เอามาจาก wiki.acioi.in.th&lt;br /&gt;
'''Fenwick Tree''' หรือ '''Binary Index Tree'''&lt;br /&gt;
&lt;br /&gt;
* ใช้แก้ปัญหาที่ว่า  &amp;quot;ถ้าต้องการใส่ค่า v ให้กับตารางช่องที่ i (พูดง่ายๆคือ arr[i] += v)   สลับกับ  การถามว่าผลบวกค่าทุกค่าในตารางช่องที่ 1 ถึงช่องที่ x มีค่าเท่าไหร่ (ผลบวกตั้งแต่ arr[1] ถึง arr[x])  ทำสลับอย่างงี้ไปเรื่อยๆ&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''สมมติให้'''&lt;br /&gt;
* Update(x, v) คือ ฟังก์ชันใส่ค่า v ในช่องที่ x&lt;br /&gt;
* FreqTo(x)  คือ ฟังก์ชันหาผลรวมตั้งแต่ช่องที่ 1 ถึงช่องที่ x&lt;br /&gt;
* FreqAt(x)  คือ ฟังก์ชันหาค่าช่องที่ x&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== เปรียบเทียบระหว่าง Array กับ Fenwick Tree ==&lt;br /&gt;
'''ถ้าใช้ Array แก้โจทย์ข้อนี้'''&lt;br /&gt;
* Update(x, v) ::ใช้เวลา O(x)&lt;br /&gt;
* FreqTo(x) ::ใช้เวลา O(x)&lt;br /&gt;
* FreqAt(x) ::ใช้เวลา O(1)&lt;br /&gt;
&lt;br /&gt;
'''ถ้าใช้ Fenwick Tree แก้โจทย์ข้อนี้'''&lt;br /&gt;
* Update(x, v) ::ใช้เวลา O(log x)&lt;br /&gt;
* FreqTo(x) ::ใช้เวลา O(log x)&lt;br /&gt;
* FreqAt(x) ::ใช้เวลา O(log x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ตัวอย่าง Code ของ Fenwick Tree (1 มิติ) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line='line'&amp;gt;&lt;br /&gt;
 /*&lt;br /&gt;
     DATA STRUCTURE&lt;br /&gt;
         + Fenwick Tree&lt;br /&gt;
             + Update(x, value)&lt;br /&gt;
                 :: O(lg n)&lt;br /&gt;
                 :: Add value at position[x]&lt;br /&gt;
             + FreqTo(x)&lt;br /&gt;
                 :: O(lg n)&lt;br /&gt;
                 :: Query summation from postion [1] to position[x]&lt;br /&gt;
             - Memory  O(max_size)&lt;br /&gt;
     AUTHOR&lt;br /&gt;
         + Roos&lt;br /&gt;
 */&lt;br /&gt;
 #include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #define MAXSIZE 1000000&lt;br /&gt;
 int tree[MAXSIZE+1], n;&lt;br /&gt;
 void update(int x, int value)&lt;br /&gt;
 {&lt;br /&gt;
     for(int i=x; i&amp;lt;=MAXSIZE; i+=(i&amp;amp;-i))&lt;br /&gt;
         tree[i] += value;&lt;br /&gt;
 }&lt;br /&gt;
 int freqTo(int x)&lt;br /&gt;
 {&lt;br /&gt;
     int sum = 0;&lt;br /&gt;
     for(int i=x; i&amp;gt;=1; i-=(i&amp;amp;-i))&lt;br /&gt;
         sum += tree[i];&lt;br /&gt;
     return sum;&lt;br /&gt;
 }&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     while(1)&lt;br /&gt;
     {&lt;br /&gt;
         char cmd[2];&lt;br /&gt;
         int x, y, value;&lt;br /&gt;
         printf(&amp;quot;\n\nEnter 'U' OR 'Q': &amp;quot;);&lt;br /&gt;
         scanf(&amp;quot;%s&amp;quot;,cmd);&lt;br /&gt;
         if(cmd[0]=='U')         //Update Value&lt;br /&gt;
         {&lt;br /&gt;
             printf(&amp;quot;Enter (x): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d&amp;quot;,&amp;amp;x);&lt;br /&gt;
             printf(&amp;quot;Enter (value): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d&amp;quot;,&amp;amp;value);&lt;br /&gt;
             update(x, value);&lt;br /&gt;
         }&lt;br /&gt;
         else if(cmd[0]=='Q')    //Query Summation&lt;br /&gt;
         {&lt;br /&gt;
             printf(&amp;quot;Enter (x): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d&amp;quot;,&amp;amp;x);&lt;br /&gt;
             value = freqTo(x);&lt;br /&gt;
             printf(&amp;quot;Summation from [1] to [%d]: %d&amp;quot;,x,value);&lt;br /&gt;
         }&lt;br /&gt;
         else&lt;br /&gt;
             printf(&amp;quot;Please Type Again&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     scanf(&amp;quot; &amp;quot;);&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ตัวอย่าง Code ของ Fenwick Tree (2 มิติ) ==&lt;br /&gt;
 /*&lt;br /&gt;
     DATA STRUCTURE&lt;br /&gt;
         + 2D Fenwick Tree&lt;br /&gt;
             + Update(x, y, value)&lt;br /&gt;
                 :: O(lg n)&lt;br /&gt;
                 :: Add value at position[x][y]&lt;br /&gt;
             + FreqTo(x, y)&lt;br /&gt;
                 :: O(lg n)&lt;br /&gt;
                 :: Query summation from postion [1][1] to position[x][y]&lt;br /&gt;
             - Memory  O(max_size)&lt;br /&gt;
     AUTHOR&lt;br /&gt;
         + Roos&lt;br /&gt;
 */&lt;br /&gt;
 #include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #define MAXSIZE 1000&lt;br /&gt;
 int tree[MAXSIZE+1][MAXSIZE+1], n;&lt;br /&gt;
 void update(int x, int y, int value)&lt;br /&gt;
 {&lt;br /&gt;
     for(int i=x; i&amp;lt;=MAXSIZE; i+=(i&amp;amp;-i))&lt;br /&gt;
         for(int j=y; j&amp;lt;=MAXSIZE; j+=(j&amp;amp;-j))&lt;br /&gt;
             tree[i][j] += value;&lt;br /&gt;
 }&lt;br /&gt;
 int freqTo(int x, int y)&lt;br /&gt;
 {&lt;br /&gt;
     int sum = 0;&lt;br /&gt;
     for(int i=x; i&amp;gt;=1; i-=(i&amp;amp;-i))&lt;br /&gt;
         for(int j=y; j&amp;gt;=1; j-=(j&amp;amp;-j))&lt;br /&gt;
             sum += tree[i][j];&lt;br /&gt;
     return sum;&lt;br /&gt;
 }&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     while(1)&lt;br /&gt;
     {&lt;br /&gt;
         char cmd[2];&lt;br /&gt;
         int x, y, value;&lt;br /&gt;
         printf(&amp;quot;\n\nEnter 'U' OR 'Q': &amp;quot;);&lt;br /&gt;
         scanf(&amp;quot;%s&amp;quot;,cmd);&lt;br /&gt;
         if(cmd[0]=='U')         //Update Value&lt;br /&gt;
         {&lt;br /&gt;
             printf(&amp;quot;Enter (x y): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d%d&amp;quot;,&amp;amp;x,&amp;amp;y);&lt;br /&gt;
             printf(&amp;quot;Enter (value): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d&amp;quot;,&amp;amp;value);&lt;br /&gt;
             update(x, y, value);&lt;br /&gt;
         }&lt;br /&gt;
         else if(cmd[0]=='Q')    //Query Summation&lt;br /&gt;
         {&lt;br /&gt;
             printf(&amp;quot;Enter (x y): &amp;quot;);&lt;br /&gt;
             scanf(&amp;quot;%d%d&amp;quot;,&amp;amp;x,&amp;amp;y);&lt;br /&gt;
             value = freqTo(x, y);&lt;br /&gt;
             printf(&amp;quot;Summation from [1][1] to [%d][%d]: %d&amp;quot;,x,y,value);&lt;br /&gt;
         }&lt;br /&gt;
         else&lt;br /&gt;
             printf(&amp;quot;Please Type Again&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     scanf(&amp;quot; &amp;quot;);&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tata</name></author>
		
	</entry>
</feed>