Skip to content

Commit 6acc05c

Browse files
committed
[IndexedTree] backjoon-2243
1 parent 5dc612b commit 6acc05c

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

src/IndexedTree/P2243/Main.java

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package IndexedTree.P2243;
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;
12+
13+
public static void main(String[] args) throws Exception{
14+
// System.setIn(new FileInputStream("src/IndexedTree/P2243/input.txt"));
15+
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
StringTokenizer st;
18+
19+
n = Integer.parseInt(br.readLine());
20+
21+
IndexedTree candies = new IndexedTree();
22+
23+
for (int i = 0; i < n; i++) {
24+
st = new StringTokenizer(br.readLine());
25+
String command = st.nextToken();
26+
if (command.equals("1")) {
27+
// rank 등수의 사탕을 꺼내는 경우
28+
int rank = Integer.parseInt(st.nextToken());
29+
candies.pop(1, 1, candies.leafSize, rank);
30+
} else if (command.equals("2")) {
31+
// 사탕 update, input 2개 더
32+
int grade = Integer.parseInt(st.nextToken());
33+
int count = Integer.parseInt(st.nextToken());
34+
candies.update(1, 1, candies.leafSize, grade, count);
35+
}
36+
// System.out.println(candies);
37+
}
38+
}
39+
}
40+
41+
class IndexedTree {
42+
int[] tree;
43+
int leafSize;
44+
int depth;
45+
46+
47+
public IndexedTree(){
48+
this.leafSize = 1000000;
49+
this.depth = 0;
50+
while (leafSize > Math.pow(2, depth))
51+
this.depth++;
52+
this.tree = new int[(int) Math.pow(2, depth + 1)];
53+
}
54+
55+
public void update(int node, int left, int right, int value, int diff){
56+
if (left <= value && value <= right) {
57+
tree[node] += diff;
58+
if (left != right){
59+
int mid = (left + right) / 2;
60+
update(node * 2, left, mid, value, diff);
61+
update(node * 2 + 1, mid + 1, right, value, diff);
62+
}
63+
}
64+
}
65+
66+
public void pop(int node, int left, int right, int rank){
67+
tree[node]--;
68+
if (left == right) {
69+
System.out.println(left);
70+
} else {
71+
int mid = (left + right) / 2;
72+
if (tree[node * 2] >= rank ){
73+
pop(node * 2, left, mid, rank);
74+
} else {
75+
pop(node * 2 + 1, mid + 1, right, rank - tree[node * 2]);
76+
}
77+
}
78+
}
79+
80+
@Override
81+
public String toString() {
82+
return "IndexedTree{" +
83+
"tree=" + Arrays.toString(tree) +
84+
", treeLength=" + tree.length +
85+
", leafSize=" + leafSize +
86+
", depth=" + depth +
87+
'}';
88+
}
89+
}

src/IndexedTree/P2243/input.txt

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

0 commit comments

Comments
 (0)