====== 수열과 쿼리 16 ====== ===== 풀이 ===== * [[ps:problems:boj:14427|수열과 쿼리 15]]에서 최솟값 쿼리 범위가 항상 전체로 되어 있던 것을, 구간 쿼리로 바꾼 문제이다. * [[ps:problems:boj:14427|수열과 쿼리 15]]에서 세그먼트 트리를 쓰는 방법 외에도, 우선순위큐를 써서 풀 수 있었지만, 이제는 세그먼트 트리를 써야만 한다. 세그먼트 트리로 푸는 방법은 똑같다. 그냥 각 노드에 값 대신에, (값, 인덱스)의 튜플을 저장해주면 구간 최솟값을 위한 세그먼트 트리를 그대로 사용해서 풀수 있다. * 시간 복잡도는 세그먼트 트리 구축에 O(n)이 필요하고 m개의 쿼리를 각각 O(logn)에 처리하므로 O(n+mlogn)이다. ===== 코드 ===== """Solution code for "BOJ 14428. 수열과 쿼리 16". - Problem link: https://www.acmicpc.net/problem/14428 - Solution link: http://www.teferi.net/ps/problems/boj/14428 """ import sys from teflib import segmenttree def main(): N = int(sys.stdin.readline()) A = [int(x) for x in sys.stdin.readline().split()] segtree = segmenttree.SegmentTree((a_i, i + 1) for i, a_i in enumerate(A)) M = int(sys.stdin.readline()) for i in range(M): query = [int(x) for x in sys.stdin.readline().split()] if query[0] == 1: _, i, v = query segtree.set(i - 1, (v, i)) else: _, i, j = query print(segtree.query(i - 1, j)[1]) if __name__ == '__main__': main() * Dependency: [[:ps:teflib:segmenttree#SegmentTree|teflib.segmenttree.SegmentTree]] {{tag>BOJ ps:problems:boj:골드_1}}