1
+ package IndexedTree ;
2
+
3
+ import java .util .Arrays ;
4
+
5
+ public class IndexedTreeTest {
6
+
7
+ public static void main (String [] args ) {
8
+ int [] inputs = {0 , 3 , 2 , 4 , 5 , 1 , 6 , 2 , 7 };
9
+ // depth 3 => leaf 8๊ฐ
10
+
11
+ IndexedTree it = new IndexedTree (inputs );
12
+ System .out .println (it );
13
+
14
+ it .makeTree (1 , 1 , it .leafSize );
15
+ System .out .println (it );
16
+
17
+ System .out .println (it .query (1 , 1 , it .leafSize , 3 , 7 ));
18
+
19
+ // index 3์ 4 -> 3์ผ๋ก ๋ฐ๊พธ๊ธฐ
20
+ int targetIndex = 3 ;
21
+ int targetValue = 3 ;
22
+ int diff = targetValue - it .nums [targetIndex ];
23
+ it .update (1 , 1 , it .leafSize , 3 , diff );
24
+ it .nums [targetIndex ] = targetValue ;
25
+ System .out .println (it );
26
+ }
27
+ }
28
+
29
+ class IndexedTree {
30
+ int [] tree ;
31
+ int [] nums ;
32
+ int leafSize , depth ;
33
+
34
+ public IndexedTree (int [] nums ){
35
+ this .nums = nums ;
36
+ this .depth = 0 ;
37
+ while (Math .pow (2 , depth ) < nums .length - 1 ) {
38
+ this .depth ++;
39
+ }
40
+ this .leafSize = (int ) Math .pow (2 , depth );
41
+ this .tree = new int [(int ) Math .pow (2 , depth + 1 )];
42
+ }
43
+
44
+ // ๋ด๋ถ ๋
ธ๋์ ๊ฐ์ ์ฑ์์ค๋ค.
45
+ public int makeTree (int node , int left , int right ){
46
+ // leaf์ ๋๋ฌํ์ ๋
47
+ if (left == right ) {
48
+ if (left <= nums .length - 1 ) {
49
+ return tree [node ] = nums [left ];
50
+ } else {
51
+ return tree [node ] = 0 ;
52
+ }
53
+ }
54
+ // ๋ด๋ถ ๋
ธ๋์ผ ๊ฒฝ์ฐ
55
+ int mid = (left + right ) / 2 ;
56
+ tree [node ] = makeTree (node * 2 , left , mid );
57
+ tree [node ] += makeTree (node * 2 + 1 , mid + 1 , right );
58
+ return tree [node ];
59
+ }
60
+
61
+ // ์ํ๋ ๊ตฌ๊ฐ์ ํฉ or ๋ฌธ์ ์ ๋ต์ ๊ตฌํ๋ค.
62
+ public int query (int node , int left , int right , int qLeft , int qRight ){
63
+ if (qRight < left || qLeft > right ){ // ๊ด๋ จ์ด ์๋ ๊ฒฝ์ฐ
64
+ return 0 ;
65
+ } else if (qLeft <= left && right <= qRight ) { // ์ฟผ๋ฆฌ์ ์์ ํ ์ํ๋ ๊ฒฝ์ฐ
66
+ return tree [node ];
67
+ } else { // ๊ทธ ์ธ : ์ ๋งคํ๊ฒ ๊ฑธ์ณ์๋ ๊ฒฝ์ฐ
68
+ int mid = (left + right ) / 2 ;
69
+ return query (node * 2 , left , mid , qLeft , qRight )
70
+ + query (node * 2 + 1 ,mid + 1 , right , qLeft , qRight );
71
+ }
72
+ }
73
+
74
+ // ํน์ ๊ฐ์ ๊ฐฑ์ ํ๋ค.
75
+ public void update (int node , int left , int right , int index , int diff ){
76
+ if (index < left || right < index ) {
77
+ return ;
78
+ } else {
79
+ tree [node ] += diff ;
80
+ if (left != right ) {
81
+ int mid = (left + right ) / 2 ;
82
+ update (node * 2 , left , mid , index , diff );
83
+ update (node * 2 + 1 , mid + 1 , right , index , diff );
84
+ }
85
+ }
86
+ }
87
+
88
+ @ Override
89
+ public String toString () {
90
+ return "IndexedTree{" +
91
+ "tree=" + Arrays .toString (tree ) +
92
+ ", nums=" + Arrays .toString (nums ) +
93
+ ", leafSize=" + leafSize +
94
+ ", depth=" + depth +
95
+ '}' ;
96
+ }
97
+ }
0 commit comments