Skip to content

Commit 5dc612b

Browse files
committed
[IndexedTree] backjoon-2042
1 parent 3f3242b commit 5dc612b

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

src/IndexedTree/P2042/Main.java

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package IndexedTree.P2042;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileInputStream;
5+
import java.io.InputStreamReader;
6+
import java.util.Arrays;
7+
import java.util.StringTokenizer;
8+
9+
public class Main {
10+
11+
static int N, M, K;
12+
static long[] nums;
13+
14+
public static void main(String[] args) throws Exception {
15+
System.setIn(new FileInputStream("src/IndexedTree/P2042/input.txt"));
16+
17+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
18+
StringTokenizer st = new StringTokenizer(br.readLine());
19+
20+
N = Integer.parseInt(st.nextToken());
21+
M = Integer.parseInt(st.nextToken());
22+
K = Integer.parseInt(st.nextToken());
23+
24+
nums = new long[N + 1];
25+
nums[0] = 0;
26+
for (int i = 1; i <= N; i++) {
27+
nums[i] = Long.parseLong(br.readLine());
28+
}
29+
30+
IndexedTree tree = new IndexedTree(nums);
31+
tree.makeTree(1, 1, tree.leafSize);
32+
// System.out.println(tree);
33+
34+
for (int i = 0; i < M+K; i++) {
35+
st = new StringTokenizer(br.readLine());
36+
String command = st.nextToken();
37+
if (command.equals("1")) {
38+
int originIndex = Integer.parseInt(st.nextToken());
39+
long targetValue = Long.parseLong(st.nextToken());
40+
long diff = targetValue - nums[originIndex];
41+
tree.update(1, 1, tree.leafSize, originIndex, diff);
42+
nums[originIndex] = targetValue;
43+
// System.out.println(tree);
44+
} else if (command.equals("2")) {
45+
int qLeft = Integer.parseInt(st.nextToken());
46+
int qRight = Integer.parseInt(st.nextToken());
47+
System.out.println(tree.query(1, 1, tree.leafSize, qLeft, qRight));
48+
}
49+
}
50+
}
51+
}
52+
53+
class IndexedTree {
54+
long[] tree;
55+
long[] nums;
56+
int leafSize, depth;
57+
58+
public IndexedTree(long[] nums){
59+
this.nums = nums;
60+
this.depth = 0;
61+
while (Math.pow(2, depth) < nums.length - 1) {
62+
this.depth ++;
63+
}
64+
this.leafSize = (int) Math.pow(2, depth);
65+
this.tree = new long[(int) Math.pow(2, depth + 1)];
66+
}
67+
68+
public long makeTree(int node, int left, int right){
69+
if (left == right) {
70+
if (left <= nums.length - 1) {
71+
return tree[node] = nums[left];
72+
} else {
73+
return tree[node] = 0;
74+
}
75+
}
76+
int mid = (left + right) / 2;
77+
tree[node] = makeTree(node * 2, left, mid);
78+
tree[node] += makeTree(node * 2 + 1, mid + 1, right);
79+
return tree[node];
80+
}
81+
82+
public long query(int node, int left, int right, int qLeft, int qRight){
83+
if (qRight < left || qLeft > right){
84+
return 0;
85+
} else if (qLeft <= left && right <= qRight) {
86+
return tree[node];
87+
} else {
88+
int mid = (left + right) / 2;
89+
return query(node * 2, left, mid, qLeft, qRight)
90+
+ query(node * 2 + 1,mid + 1, right, qLeft, qRight);
91+
}
92+
}
93+
94+
public void update(int node, int left, int right, int index, long diff){
95+
if (index < left || right < index) {
96+
return;
97+
} else {
98+
tree[node] += diff;
99+
if (left != right) {
100+
int mid = (left + right) / 2;
101+
update(node * 2, left, mid, index, diff);
102+
update(node * 2 + 1, mid + 1, right, index, diff);
103+
}
104+
}
105+
}
106+
107+
@Override
108+
public String toString() {
109+
return "IndexedTree{" +
110+
"tree=" + Arrays.toString(tree) +
111+
", nums=" + Arrays.toString(nums) +
112+
", leafSize=" + leafSize +
113+
", depth=" + depth +
114+
'}';
115+
}
116+
}

src/IndexedTree/P2042/input.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
5 2 2
2+
1
3+
2
4+
3
5+
4
6+
5
7+
1 3 6
8+
2 2 5
9+
1 5 2
10+
2 3 5

0 commit comments

Comments
 (0)