#include <bits/stdc++.h>
using namespace std;

#define INF 2147483647

vector<int> arr;
vector<int> SegmentTree;

void Make_SegmentTree(int Node, int Start, int End) 
{
	if (Start == End) SegmentTree[Node] = arr[Start];
	else {
		Make_SegmentTree(Node * 2, Start, (Start + End) / 2);
		Make_SegmentTree(Node * 2 + 1, (Start + End) / 2 + 1, End);
		SegmentTree[Node] = min(SegmentTree[Node * 2], SegmentTree[Node * 2 + 1]);
	}
}

int SearchMin(int Node, int Start, int End, int Left, int Right) {
	if (Left > End || Right < Start) return INF;
	if (Left <= Start && End <= Right) return SegmentTree[Node];

	int Left_Result = SearchMin(Node * 2, Start, (Start + End) / 2, Left, Right);
	int Right_Result = SearchMin(Node * 2 + 1, (Start + End) / 2 + 1, End, Left, Right);
	return min(Left_Result, Right_Result);
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(NULL);

	int N, M;
	cin >> N >> M;

	// 입력받고
	arr.resize(N);
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}

	// 세그먼트트리 만들고
	int Tree_Height = (int)ceil(log2(N));
	int Tree_Size = (1 << (Tree_Height + 1));
	SegmentTree.resize(Tree_Size);
	Make_SegmentTree(1, 0, N - 1);

	// 요청받고
	int a, b;
	while(M--) {
		cin >> a >> b;

		// a에서 b까지 최소값 출력, 인덱스니까 a, b 1씩 빼주기
		cout << SearchMin(1, 0, N - 1, a - 1, b - 1) << '\n';
	}

	return 0;
}

https://www.acmicpc.net/problem/10868

 

대표적인 세그먼트트리로 구간 최솟값 구하기 문제

세그먼트 트리는 구간값의 탐색과 변경이 빈번할때 사용하는 줄 알았는데 변경이 없이 탐색만 있는 경우에도 굉장히 유용한 듯 하다.

그냥 구간을 여러번 확인해야 한다면 세그먼트트리 사용하면 될듯하다.

 

정답코드)