본문 바로가기

Algorithm

(C++) - 백준(BOJ)코딩 10868 : 최소값 답

반응형

세그먼트 트리의 기본 예제문제였습니다.


Code : 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
int n, m;
void init(vector <int> &tree, vector <int>&a, int node, int start, int end)//트리에 시작점을 넣어 초기화해주는 함수
{
    if(start==end)
        tree[node] = a[start];
    else
    {
        init(tree, a, node * 2, start, (start + end) / 2);
        init(tree, a, node * + 1, (start + end) / + 1, end);
        tree[node] = min(tree[node * 2], tree[node * + 1]);
    }
 
}
int query(vector <int>&tree, int node, int start, int end, int i, int j)
{
    if (i > end || j < start) { return -1; }//시작점과 끝점의 범위를 넘어간다면 -1리턴
    if (i <= start && end <= j) { return tree[node]; }//범위 안이라면 노드의 값을 리턴
    int m1 = query(tree, node * 2, start, (start + end) / 2, i, j);
    int m2 = query(tree, node * + 1, (start + end) / + 1,end, i, j);
    if (m1 == -1) { return m2; }
    else if (m2 == -1) { return m1; }
    else { return min(m1, m2); }
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    vector <int> a(n);
    int h = ceil(log2(n));
    int tree_size = (<< (h + 1));
    vector <int> tree(tree_size);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    init(tree, a, 1,0,n-1);
    while (m--)
    {
        int start, end;
        cin >> start >> end;
        cout << query(tree, 10, n - 1, start - 1, end - 1<< '\n';
    }
}
cs