세그먼트 트리 이용해주면 금세 풀 수 있을 문제?
#include <iostream>
#include <vector>
#define BIG 1e9;
using namespace std;
int N, M;
vector<long long> Tree;
vector<long long> arr;
vector<pair<int,pair<int, long>>> query;
void input(){
cin >> N;
arr.resize(N, 0);
Tree.resize(N * 4, 0);
for(int i = 0; i < N; i++) {
cin >> arr[i];
}
cin >> M;
for(int i = 0; i < M ; i++){
int op, a;
long long b;
cin >> op >> a >> b;
query.push_back({op, {a,b}});
}
}
long long Min(long long a, long long b){
return a < b? a:b;
}
long long init(int start, int end, int node){
if(start == end) return Tree[node] = arr[start];
int mid = (start + end)/2;
Tree[node] = Min(init(start, mid, node * 2), init(mid + 1, end, node * 2 + 1));
return Tree[node];
}
long long queryMin(int start, int end, int node, int left, int right){
if(left > end || right < start) return BIG;
if(left <= start && right >= end) return Tree[node];
int mid = (start + end)/2;
return Min(queryMin(start, mid, node * 2, left, right), queryMin(mid + 1, end, node * 2 + 1, left, right));
}
long long update(int start, int end, int node, int index, long long diff) {
if(index < start || index > end) return Tree[node];
if(start == end) return Tree[node] = diff;
int mid = (start + end)/2;
return Tree[node] = Min(update(start, mid, node * 2, index, diff) , update(mid + 1, end, node * 2 + 1,index, diff));
}
void solve(){
for(int i = 0; i < M; i++){
int op, a;
long long b;
op = query[i].first;
a = query[i].second.first;
b = query[i].second.second;
if(op == 1){
//update
update(0, N-1, 1, a-1, b);
}
else if(op == 2){
//minquery
cout << queryMin(0, N-1, 1, a-1, b-1) << "\n";
}
}
}
int main(void){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
input();
init(0, N-1, 1);
solve();
return 0;
}