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";
}
}