https://www.acmicpc.net/problem/2357
2357번: 최솟값과 최댓값
N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100
www.acmicpc.net
10868문제와 똑같다. 최솟값 저장 트리 하나, 최댓값 저장 트리 하나를 만들어서 구하면 된다.
#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
using namespace std;
vc MaxTree(100000*4),MinTree(100000*4),v;
int MaxInit(int st,int en,int node){
if(st == en) return MaxTree[node] = v[st];
int mid = (st + en) / 2;
return MaxTree[node] = max(MaxInit(st,mid,node*2), MaxInit(mid+1,en,node*2+1));
}
int SearctMax(int st,int en,int node,int L,int R){
if(L > en || R < st) return 0;
if(L <= st && en <= R) return MaxTree[node];
int mid = (st + en) / 2;
return max(SearctMax(st,mid,node*2,L,R), SearctMax(mid+1,en,node*2+1,L,R));
}
int MinInit(int st,int en,int node){
if(st == en) return MinTree[node] = v[st];
int mid = (st + en) / 2;
return MinTree[node] = min(MinInit(st,mid,node*2), MinInit(mid+1,en,node*2+1));
}
int SearctMin(int st,int en,int node,int L,int R){
if(L > en || R < st) return INF;
if(L <= st && en <= R) return MinTree[node];
int mid = (st + en) / 2;
return min(SearctMin(st,mid,node*2,L,R), SearctMin(mid+1,en,node*2+1,L,R));
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,m;
cin >> n >> m;
for(int i=0;i<n;i++){
int a;cin >> a;v.push_back(a);
}
MaxInit(0,n-1,1);
MinInit(0,n-1,1);
while(m--){
int a,b;
cin >> a >> b;
cout << SearctMin(0,n-1,1,a-1,b-1) << " " <<SearctMax(0,n-1,1,a-1,b-1) << "\n";
}
}
'baekjoon' 카테고리의 다른 글
14438번 수열과 쿼리 17 (0) | 2022.03.21 |
---|---|
1275번 커피숍2 (0) | 2022.03.21 |
10868번 최솟값 (0) | 2022.03.21 |
11505번 구간 곱 구하기 (0) | 2022.03.21 |
2042번 구간 합 구하기 (0) | 2022.03.21 |