baekjoon

10868번 최솟값

gokimkh 2022. 3. 21. 11:44

 

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

 

10868번: 최솟값

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

www.acmicpc.net

기본적인 세그먼트 트리 문제이다.

[a,b]구간중에 제일 최솟값을 트리에 넣으면 된다.

#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
using namespace std;

int init(int st,int en,int node,vc &v,vc &tree){
    if(st == en) return tree[node] = v[st];

    int mid = (st + en) / 2;

    return tree[node] = min(init(st,mid,node*2,v,tree),init(mid+1,en,node*2+1,v,tree));
}

int Search(int st,int en,int node,int L,int R,vc &v,vc &tree){
    if(L > en || R < st) return INF;

    if(L <= st && en <= R) return tree[node];

    int mid = (st + en) / 2;

    return min(Search(st,mid,node*2,L,R,v,tree), Search(mid+1,en,node*2+1,L,R,v,tree));
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    int n,m,a,b;

    cin >> n >> m;

    vc v(n),tree(n*4);

    for(auto &i : v)
        cin >> i;

    init(0,n-1,1,v,tree);

    while(m--){
        cin >> a >> b;

        cout << Search(0,n-1,1,a-1,b-1,v,tree) << "\n";
    }

}