Skip to content

Commit 1008a6f

Browse files
committed
[IndexedTree] baekjoon-12837
1 parent 830dd77 commit 1008a6f

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
| 04 | | [Baekjoon-5676 음주 코딩](./src/IndexedTree/P5676) | |
9696
| 05 | | [Baekjoon-1275 커피숍2](./src/IndexedTree/P1275) | |
9797
| 06 | | [Baekjoon-2268 수들의 합](./src/IndexedTree/P2268) | |
98+
| 07 | | [Baekjoon-12837 가계부 (Hard)](./src/IndexedTree/P12837) | |
9899

99100
### Trie
100101

src/IndexedTree/P12837/Main.java

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package IndexedTree.P12837;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class Main {
7+
8+
static int N, Q;
9+
static long[] segTree;
10+
11+
public static void main(String[] args) throws Exception {
12+
System.setIn(new FileInputStream("src/IndexedTree/P12837/input.txt"));
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st = new StringTokenizer(br.readLine());
15+
16+
N = Integer.parseInt(st.nextToken());
17+
Q = Integer.parseInt(st.nextToken());
18+
19+
segTree = new long[(int) Math.pow(2, Math.ceil(Math.log(N) / Math.log(2)) + 1)];
20+
StringBuilder sb = new StringBuilder();
21+
while (Q-- > 0) {
22+
st = new StringTokenizer(br.readLine());
23+
int cmd = Integer.parseInt(st.nextToken());
24+
int p1 = Integer.parseInt(st.nextToken()), p2 = Integer.parseInt(st.nextToken());
25+
26+
if (cmd == 1) query1(1, 1, N, p1, p2);
27+
else sb.append(query2(1, 1, N, p1, p2)).append("\n");
28+
}
29+
System.out.println(sb.toString());
30+
}
31+
32+
static void query1(int node, int start, int end, int p, int x) {
33+
if (start <= p && p <= end) {
34+
if (start == end) segTree[node] += x;
35+
else {
36+
query1(node*2, start, (start+end)/2, p, x);
37+
query1(node*2+1, (start+end)/2+1, end, p, x);
38+
segTree[node] = segTree[node*2] + segTree[node*2+1];
39+
}
40+
}
41+
}
42+
43+
static long query2(int node, int start, int end, int p, int q) {
44+
if (q < start || end < p) return 0;
45+
if (p <= start && end <= q) return segTree[node];
46+
return query2(node*2, start, (start+end)/2, p, q)
47+
+ query2(node*2+1, (start+end)/2+1, end, p, q);
48+
}
49+
}

src/IndexedTree/P12837/README.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
## [baekjoon-12837] 가계부 (Hard)
2+
3+
![image](https://user-images.githubusercontent.com/22045163/104865813-5adc3900-5980-11eb-8391-dbde17af9525.png)
4+
5+
### 문제 이해
6+
7+
처음에 문제를 잘못 이해해서 문제를 틀리게 되었다.
8+
해당 문제의 1번 쿼리는 **값을 변경하는 것이 아니라, 추가하는 것**이라고 나와있다.
9+
문제를 잘 읽어야 한다.
10+
11+
![image](https://user-images.githubusercontent.com/22045163/104865962-b3133b00-5980-11eb-8aa2-88f70d0bcfb3.png)

src/IndexedTree/P12837/input.txt

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
10 7
2+
1 3 10000
3+
1 4 -5000
4+
1 7 -3000
5+
2 4 7
6+
1 6 35000
7+
2 4 10
8+
2 3 4
9+
10+
99 3
11+
1 1 1
12+
1 1 1
13+
2 1 1
14+
15+
16+
17+
//output
18+
2000
19+
27000
20+
21+
10 10
22+
1 1 1
23+
1 2 2
24+
1 3 3
25+
1 4 4
26+
1 5 5
27+
1 6 6
28+
1 7 7
29+
1 8 8
30+
1 9 9
31+
1 10 10
32+

0 commit comments

Comments
 (0)