X
최소값과 최대값
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
String[] line1 = br.readLine().split(" ");
int N = Integer.parseInt(line1[0]);
int M = Integer.parseInt(line1[1]);
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
int height = (int) Math.ceil(getTreeHeight(N));
int[][] tree = new int[1 << (height+1)][2];
init(arr, tree, 1, 0, N - 1); // 최대값 init
init_Min(arr, tree, 1, 0, N - 1); // 최소값 init
for (int i = 0; i < M; i++) {
String[] line2 = br.readLine().split(" ");
int a = Integer.parseInt(line2[0]);
int b = Integer.parseInt(line2[1]);
int min = search_min(tree, 1, 0, arr.length-1, a-1, b-1);
int max = search_max(tree, 1, 0, arr.length-1, a-1, b-1);
pw.println(min+" "+max);
pw.flush();
}
}
public static double getTreeHeight(long num) {
return Math.log10(num) / Math.log10(2);
}
public static int init(int[] arr, int[][] tree, int node, int start, int end) {
if (start == end) {
return tree[node][0] = arr[start];
}
int mid = (start + end) / 2;
return tree[node][0] = Math.max(init(arr, tree, 2 * node, start, mid),
init(arr, tree, (2 * node) + 1, mid + 1, end));
}
public static int init_Min(int[] arr, int[][] tree, int node, int start, int end) {
if (start == end) {
return tree[node][1] = arr[start];
}
int mid = (start + end) / 2;
return tree[node][1] = Math.min(init_Min(arr, tree, 2 * node, start, mid),
init_Min(arr, tree, (2 * node) + 1, mid + 1, end));
}
public static int search_min(int[][] tree, int node, int start, int end, int left, int right) {
if (right < start || end < left) {
return 1000000001;
}
if (left <= start && end <= right) {
return tree[node][1];
}
int mid = (start + end) / 2;
return Math.min(search_min(tree, 2 * node, start, mid, left, right),
search_min(tree, 2 * node + 1, mid + 1, end, left, right));
}
public static int search_max(int[][] tree, int node, int start, int end, int left, int right) {
if (right < start || end < left) {
return 0;
}
if (left <= start && end <= right) {
return tree[node][0];
}
int mid = (start + end) / 2;
return Math.max(search_max(tree, 2 * node, start, mid, left, right),
search_max(tree, 2 * node + 1, mid + 1, end, left, right));
}
}
최근 글
같은 카테고리의 다른 글
- 9933번 민균이의 비밀번호
- 1764번 듣보잡
- 1475번 방 번호
- 1157번 단어공부
- 최소값과 최대값
- 구간 합 구하기
- 최소값
- 1181번 - 단어 정렬
- 11652번 - 카드
- 2169번 - 로봇 조종하기
- 2178번 - 미로 탐색
- 9084번 - 동전
- 2098번 - 외판원 순회
- 11049번 - 행렬 곱셉 순서
- 2302번 - 극장 좌석
- 1495번 - Day of Mourning
- 11060번 - 점프 점프
- 5557번 - 1학년
- 1697번 - 숨바꼭질
- 2631번 - 줄세우기
- 11004번 - K번째 수
- 9507번 - Generations of Tribbles
- 1904번 - 01타일
- 10942번 - 팰린드롬
- 10164번 - 격자상의 경로
- 2011번 - 암호코드
- 11066번 - 파일합치기
- 11054번 - 가장 긴 바이토닉 수열
- 11724번 - 연결 요소 개수
- 11403번 - 경로찾기
- 2667번 - 단지번호붙이기
- 3187번 - 양치기 꿍
- 2225번 - 합분해
- 1965번 - 상자넣기
- 1937번 - 욕심쟁이 판다
- 1890번 - 점프
- 1520번 - 내리막길