Skip to content

Commit 1af9a83

Browse files
committedJan 19, 2021
[IndexedTree] baekjoon-2357
1 parent ce492ce commit 1af9a83

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
| 06 | | [Baekjoon-2268 수들의 합](./src/IndexedTree/P2268) | |
9898
| 07 | | [Baekjoon-12837 가계부 (Hard)](./src/IndexedTree/P12837) | |
9999
| 08 | | [Baekjoon-11505 구간 곱 구하기](./src/IndexedTree/P11505) | |
100+
| 09 | | [Baekjoon-2357 최솟값과 최댓값](./src/IndexedTree/P2357) | |
100101

101102
### Trie
102103

‎src/IndexedTree/P2357/Main.java

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package IndexedTree.P2357;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class Main {
7+
8+
static int N, M;
9+
static int[] arr;
10+
static int[][] segTree;
11+
12+
public static void main(String[] args) throws Exception {
13+
System.setIn(new FileInputStream("src/IndexedTree/P2357/input.txt"));
14+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15+
StringTokenizer st = new StringTokenizer(br.readLine());
16+
17+
N = Integer.parseInt(st.nextToken());
18+
M = Integer.parseInt(st.nextToken());
19+
20+
arr = new int[N+1];
21+
for (int i = 1; i <= N; i++) arr[i] = Integer.parseInt(br.readLine());
22+
23+
segTree = new int[(int) Math.pow(2, Math.ceil(Math.log(N) / Math.log(2)) + 1)][2];
24+
makeTree(1, 1, N);
25+
26+
StringBuilder sb = new StringBuilder();
27+
while(M-- > 0) {
28+
st = new StringTokenizer(br.readLine());
29+
int a = Integer.parseInt(st.nextToken()), b = Integer.parseInt(st.nextToken());
30+
sb.append(getMin(1, 1, N, a, b)).append(" ")
31+
.append(getMax(1, 1, N, a, b)).append("\n");
32+
}
33+
System.out.println(sb.toString());
34+
}
35+
36+
static void makeTree(int node, int start, int end) {
37+
if (start == end) {
38+
segTree[node][0] = arr[start];
39+
segTree[node][1] = arr[end];
40+
return;
41+
}
42+
makeTree(node*2, start, (start+end)/2);
43+
makeTree(node*2+1, (start+end)/2+1, end);
44+
segTree[node][0] = Math.min(segTree[node*2][0], segTree[node*2+1][0]);
45+
segTree[node][1] = Math.max(segTree[node*2][1], segTree[node*2+1][1]);
46+
}
47+
48+
static int getMin(int node, int start, int end, int a, int b) {
49+
if (b < start || end < a) return Integer.MAX_VALUE;
50+
if (a <= start && end <= b) return segTree[node][0];
51+
return Math.min(getMin(node*2, start, (start+end)/2, a, b),
52+
getMin(node*2+1,(start+end)/2+1, end, a, b));
53+
}
54+
55+
static int getMax(int node, int start, int end, int a, int b) {
56+
if (b < start || end < a) return Integer.MIN_VALUE;
57+
if (a <= start && end <= b) return segTree[node][1];
58+
return Math.max(getMax(node*2, start, (start+end)/2, a, b),
59+
getMax(node*2+1,(start+end)/2+1, end, a, b));
60+
}
61+
}

‎src/IndexedTree/P2357/README.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## [baekjoon-2357] 최솟값과 최댓값
2+
3+
![image](https://user-images.githubusercontent.com/22045163/104977584-35fcca00-5a43-11eb-9741-0a468b3e6739.png)
4+
5+
![image](https://user-images.githubusercontent.com/22045163/104977602-414ff580-5a43-11eb-839a-c60d3778b34c.png)

‎src/IndexedTree/P2357/input.txt

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
10 4
2+
75
3+
30
4+
100
5+
38
6+
50
7+
51
8+
52
9+
20
10+
81
11+
5
12+
1 10
13+
3 5
14+
6 9
15+
8 10

0 commit comments

Comments
 (0)
Please sign in to comment.