문제 링크
풀이
세그먼트 트리 문제다.
세그먼트 트리에 최솟값을 저장할 때, 인덱스도 포함하여 저장하면 된다.
cf) 나는 min도 구현을 해서 사용했지만, stl에 있는 min()을 그냥 사용해도 된다.
코드
#include <cstdio>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
int arr[100005];
pii tree[400005];
pii min(pii &a, pii &b) {
if (a.first < b.first) return a;
if (a.first == b.first) {
if (a.second < b.second) return a;
else return b;
}
else return b;
}
pii query(int node, int s, int e, int qs, int qe) {
if (e < qs || qe < s) return {1e9, 1e9};
if (qs <= s && e <= qe) return tree[node];
int mid = (s + e) >> 1;
return min(query(2 * node, s, mid, qs, qe), query(2 * node + 1, mid + 1, e, qs, qe));
}
void update(int node, int s, int e, int idx, int num) {
if (e < idx || idx < s) return;
if (s == e) {
tree[node] = {num, idx};
return;
}
int mid = (s + e) >> 1;
update(2 * node, s, mid, idx, num);
update(2 * node + 1, mid + 1, e, idx, num);
tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
void init(int node, int s, int e) {
if (s == e) {
tree[node] = {arr[s], s};
return;
}
int mid = (s + e) >> 1;
init(2 * node, s, mid);
init(2 * node + 1, mid + 1, e);
tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
int main() {
int n; scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", arr + i);
init(1, 0, 1e5);
int q; scanf("%d", &q);
while (q--) {
int t, a, b; scanf("%d %d %d", &t, &a, &b);
if (t == 1) {
update(1, 0, 1e5, a, b);
} else {
printf("%d\n", query(1, 0, 1e5, a, b).second);
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[16507] 어두운 건 무서워 (0) | 2021.10.15 |
---|---|
백준[3015] 오아시스 재결합 (0) | 2021.10.15 |
백준[20164] 홀수 홀릭 호석 (0) | 2021.10.14 |
백준[16401] 과자 나눠주기 (0) | 2021.10.14 |
백준[2239, 2580] 스도쿠 (0) | 2021.10.14 |