Skip to content

Commit db6f591

Browse files
authored
BOJ #18436: 수열과 쿼리 37
1 parent 8a69754 commit db6f591

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

BOJ/18436/Main.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Author: Minho Kim (ISKU)
3+
* Date: February 14, 2020
4+
* E-mail: minho.kim093@gmail.com
5+
*
6+
* https://github.com/ISKU/Algorithm
7+
* https://www.acmicpc.net/problem/18436
8+
*/
9+
10+
import java.io.*;
11+
import java.util.*;
12+
13+
public class Main {
14+
15+
private static int[] tree;
16+
private static int H;
17+
18+
public static void main(String... args) throws Exception {
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
21+
int N = Integer.parseInt(br.readLine());
22+
23+
H = 1 << (int) Math.ceil(Math.log(N) / Math.log(2));
24+
tree = new int[H * 2];
25+
StringTokenizer st = new StringTokenizer(br.readLine());
26+
for (int i = 1; i <= N; i++) {
27+
int n = Integer.parseInt(st.nextToken());
28+
update(i, n);
29+
}
30+
31+
int M = Integer.parseInt(br.readLine());
32+
while (M-- > 0) {
33+
st = new StringTokenizer(br.readLine());
34+
int cmd = Integer.parseInt(st.nextToken());
35+
36+
if (cmd == 1) {
37+
int i = Integer.parseInt(st.nextToken());
38+
int x = Integer.parseInt(st.nextToken());
39+
update(i, x);
40+
} else if (cmd == 2) {
41+
int l = Integer.parseInt(st.nextToken());
42+
int r = Integer.parseInt(st.nextToken());
43+
int sum = r - l + 1 - sum(1, H, 1, l, r);
44+
bw.write(String.valueOf(sum));
45+
bw.write('\n');
46+
} else if (cmd == 3) {
47+
int l = Integer.parseInt(st.nextToken());
48+
int r = Integer.parseInt(st.nextToken());
49+
int sum = sum(1, H, 1, l, r);
50+
bw.write(String.valueOf(sum));
51+
bw.write('\n');
52+
}
53+
}
54+
55+
bw.close();
56+
}
57+
58+
private static void update(int i, int x) {
59+
i += H - 1;
60+
tree[i] = x % 2;
61+
62+
while (i > 0) {
63+
i /= 2;
64+
tree[i] = tree[i * 2] + tree[i * 2 + 1];
65+
}
66+
}
67+
68+
private static int sum(int l, int r, int i, int L, int R) {
69+
if (r < L || R < l)
70+
return 0;
71+
if (L <= l && r <= R)
72+
return tree[i];
73+
74+
int mid = (l + r) / 2;
75+
return sum(l, mid, i * 2, L, R) + sum(mid + 1, r, i * 2 + 1, L, R);
76+
}
77+
}

0 commit comments

Comments
 (0)