BOJ Code/Gold

[백준/BOJ] gold1 - 10868번 최솟값 (Python)

NIMHO 2023. 9. 30. 15:47
728x90

▶10868 - 최솟값

백준 로고

문제

N(1 ≤ N ≤ 100,000) 개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000) 개 주어졌을 때는 어려운 문제가 된다. 이 문제를 해결해 보자.

여기서 a번째라는 것은 입력되는 순서로 a번째라는 이야기이다. 예를 들어 a=1, b=3이라면 입력된 순서대로 1번, 2번, 3번 정수 중에서 최솟값을 찾아야 한다. 각각의 정수들은 1 이상 1,000,000,000 이하의 값을 갖는다.

 

입력

첫째 줄에 N, M이 주어진다. 다음 N개의 줄에는 N개의 정수가 주어진다. 다음 M개의 줄에는 a, b의 쌍이 주어진다.

 

출력

M개의 줄에 입력받은 순서대로 각 a, b에 대한 답을 출력한다.

728x90

풀이

최대, 최소를 출력해야 하는 지난 문제를 그대로 사용하면 된다.

2023.09.28 - [BOJ Code/Gold] - [백준/BOJ] gold1 - 2357번 최솟값과 최댓값 (Python)

 

[백준/BOJ] gold1 - 2357번 최솟값과 최댓값 (Python)

▶2357 - 최솟값과 최댓값 ▶문제 N(1 ≤ N ≤ 100,000) 개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이

dhalsdl12.tistory.com

최솟값과 최댓값 구하는 문제에서 최솟값만 출력해 주면 된다.

그럼 정답이 나온다.

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)

def init(start, end, index):
    if start == end:
        tree[index] = [arr[start], arr[start]]
        return tree[index]

    mid = (start + end) // 2
    l = init(start, mid, index * 2)
    r = init(mid + 1, end, index * 2 + 1)
    tree[index] = [min(l[0], r[0]), max(l[1], r[1])]

    return tree[index]


def find(start, end, index, left, right):
    if start > right or end < left:
        return [10 ** 9 + 1, 0]
    
    if left <= start and right >= end:
        return tree[index]
    
    mid = (start + end) // 2
    l = find(start, mid, index * 2, left, right)
    r = find(mid + 1, end, index * 2 + 1, left, right)
    return [min(l[0], r[0]), max(l[1], r[1])]
    
    
n, m = map(int, input().split())
arr = []
tree = [0 for _ in range(n * 4)]
answer = []

for _ in range(n):
    arr.append(int(input()))

init(0, n - 1, 1)

for _ in range(m):
    a, b = map(int, input().split())
    answer.append(find(0, n - 1, 1, a - 1, b - 1))

for ans in answer:
    print(ans[0])
728x90