세그먼트 트리를 이용해 풀 수 있었던 문제.
이 때, 최솟값트리 minTree와 최댓값트리 maxTree를 각각 계산했다.
코드는 다음과 같다.
#include <iostream>
#include <vector>
#define BIG 1e9;
#define SMALL -1;
using namespace std;
vector<long long> arr;
vector<long long> minTree;
vector<long long> maxTree;
vector<pair<int, int>> query;
int N;
int M;
long long Min(long long a, long long b){
return a < b? a : b;
}
long long Max(long long a, long long b){
return a > b? a : b;
}
long long init_minTree(int start, int end, int node){
if(start == end) return minTree[node] = arr[start];
int mid = (start + end)/2;
minTree[node] = Min(init_minTree(start, mid, node * 2), init_minTree(mid + 1, end, node * 2 + 1));
return minTree[node];
}
long long init_maxTree(int start, int end, int node){
if(start == end) return maxTree[node] = arr[start];
int mid = (start + end)/2;
maxTree[node] = Max(init_maxTree(start, mid, node * 2) , init_maxTree(mid + 1, end, node * 2 + 1));
return maxTree[node];
}
long long query_minTree(int start, int end, int node, int left, int right){
if(left > end || right < start) return BIG;
if(left <= start && right >= end) return minTree[node];
int mid = (start + end)/2;
return Min(query_minTree(start, mid, node * 2, left, right), query_minTree(mid + 1, end, node * 2 + 1, left, right));
}
long long query_maxTree(int start, int end, int node, int left, int right){
if(left > end || right < start) return SMALL;
if(left <= start && right >= end) return maxTree[node];
int mid = (start + end)/2;
return Max(query_maxTree(start, mid, node * 2, left, right), query_maxTree(mid + 1, end, node * 2 + 1, left, right));
}
void input(){
cin >> N >> M;
arr.resize(N, 0);
minTree.resize(N * 4, 0);
maxTree.resize(N * 4, 0);
for(int i = 0; i < N; i++){
cin >> arr[i];
}
for(int i = 0; i < M; i++){
int a, b;
cin >> a >> b;
query.push_back({a,b});
}
}
void solve(){
for(int i = 0; i < M; i++){
int a = query[i].first - 1;
int b = query[i].second - 1;
cout << query_minTree(0, N-1, 1, a, b) << " " << query_maxTree(0, N-1, 1, a, b) << "\n";
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
input();
init_minTree(0, N-1, 1);
init_maxTree(0, N-1, 1);
solve();
return 0;
}
