새소식

PS/백준

[백준/14438] 수열과 쿼리 17 (Python)

  • -

Problem : https://www.acmicpc.net/problem/14438

 

14438번: 수열과 쿼리 17

길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i v : Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 109) 2 i j : Ai, Ai+1, ..., Aj에서 크기가 가장 작은 값을

www.acmicpc.net

 

Difficulty : Gold 1

 

Status : Solved

 

Time : 00:07:08

 


 

문제 설명

 

더보기

 

길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오.

 

  • 1 i v : Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 10^9)
  • 2 i j : Ai, Ai+1, ..., Aj에서 크기가 가장 작은 값을 출력한다. (1 ≤ i ≤ j ≤ N)

 

수열의 인덱스는 1부터 시작한다.

 

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 수열의 크기 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)

셋째 줄에는 쿼리의 개수 M이 주어진다. (1 ≤ M ≤ 100,000)

넷째 줄부터 M개의 줄에는 쿼리가 주어진다.

 

출력

 

2번 쿼리에 대해서 정답을 한 줄에 하나씩 순서대로 출력한다.

 

입력 예시

 

5
5 4 3 2 1
6
2 1 3
2 1 4
1 5 3
2 3 5
1 4 3
2 3 5

 

출력 예시

 

3
2
2
3

 

 


 

풀이

 

요즘 쿼리 문제만 풀다보니 세그먼트 트리는 바로바로 튀어나오는 지경이다. O(logN)의 시간복잡도로 구간 최솟값과 업데이트가 가능한 세그먼트 트리를 사용하는 골자의 문제이다.

 

풀이 코드

import sys
input = sys.stdin.readline
MAX = float('inf')

N = int(input())
nums = list(map(int, input().split()))
tree = [MAX]*(4*N)

def init(start, end, idx) :
  if start == end :
    tree[idx] = nums[start]
    return
  mid = (start + end) // 2
  init(start, mid, idx*2)
  init(mid+1, end, idx*2+1)
  tree[idx] = min(tree[idx*2], tree[idx*2+1])

def update(start, end, idx, target, val) :
  if start > target or end < target :
    return
  if start == end :
    tree[idx] = val
    return
  mid = (start + end) // 2
  update(start, mid, idx*2, target, val)
  update(mid+1, end, idx*2+1, target, val)
  tree[idx] = min(tree[idx*2], tree[idx*2+1])

def search(start, end, idx, left, right) :
  if right < start or end < left :
    return MAX
  if left <= start <= end <= right :
    return tree[idx]
  mid = (start + end) // 2
  lval = search(start, mid, idx*2, left, right)
  rval = search(mid+1, end, idx*2+1, left, right)
  return min(lval, rval)

init(0, N-1, 1)
M = int(input())
for _ in range(M) :
  q, i, j = map(int, input().split())
  if q == 1  :
    update(0, N-1, 1, i-1, j)
  else :
    print(search(0, N-1, 1, i-1, j-1))

풀이 완료!

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.