백준_10868 최솟값 (세그먼트 트리)Algorithm/Algorithm 문제2024. 3. 16. 17:27
Table of Contents
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_10868_최솟값 {
static long[] tree;
static int leafSize;
static StringBuilder result = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int treeHeight = 0;
while (Math.pow(2, treeHeight) < n) {
treeHeight++;
}
leafSize = (int) Math.pow(2, treeHeight);
tree = new long[leafSize * 2];
int i;
for (i=leafSize; i<leafSize + n; i++) {
tree[i] = Long.parseLong(br.readLine());
}
for (i=leafSize-1; i>0; i--) {
if (tree[i*2] == 0) {
tree[i] = tree[i*2 + 1];
} else if (tree[i*2 + 1] == 0) {
tree[i] = tree[i*2];
} else {
tree[i] = Math.min(tree[i*2], tree[i*2 + 1]);
}
}
int a, b, s, e;
for (i=0; i<m; i++) {
st = new StringTokenizer(br.readLine(), " ");
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
s = a + leafSize - 1;
e = b + leafSize - 1;
printMin(s, e);
}
System.out.println(result);
}
static void printMin(int s, int e) {
long min = Long.MAX_VALUE;
while (s<=e) {
if (s%2 == 1) {
if (tree[s] != 0) {
min = Math.min(min, tree[s]);
}
}
if (e%2 == 0) {
if (tree[e] != 0) {
min = Math.min(min, tree[e]);
}
}
s = (s + 1)/2;
e = (e - 1)/2;
}
result.append(min).append("\n");
}
}
'Algorithm > Algorithm 문제' 카테고리의 다른 글
백준_11437 LCA (최소공통조상 일반) (0) | 2024.03.18 |
---|---|
백준_11505 구간 곱 구하기 (세그먼트 트리) (1) | 2024.03.17 |
백준_2042 구간 합 구하기 (세그먼트 트리) (0) | 2024.03.16 |
백준_1991 트리 순회 (이진트리, 순회) (0) | 2024.03.08 |
백준_14425 문자열 집합 (트라이) (0) | 2024.03.07 |
@kjyyjk :: 녕의 학습 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!