문제 주소 : www.acmicpc.net/problem/2042
문제 확인
세그먼트 트리를 활용하면 쉽게 풀 수 있는 문제입니다.
세그먼트 트리 : latter2005.tistory.com/28
수 변경은 구간이 아닌 단일 숫자에서 일어나므로 Lazy propagation을 사용할 필요 없습니다.
풀이
세그먼트 트리를 작성하고 출력 쿼리는 같은 방식으로 출력하면 됩니다.
b번째 숫자를 c로 변경하는 방법은 b번째 숫자가 저장되어 있는 배열의 인덱스는 tree[b + n - 1]이므로 이를 c로 변경한 후 트리에 반영해 주면 됩니다.
tree[b + n - 1]의 부모 노드는 tree[(b + n - 1)/2]이므로 c로 변경했을 때 차이만큼 반영해 주면 됩니다. 이를 루트 노드까지 반복해 주면 모든 트리에 반영이 됩니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <cstdio>
using namespace std;
int main() {
long long n, m, k;
long long tree[2000002];
scanf("%lld%lld%lld", &n, &m, &k);
for (int i = 0; i < n; i++)
scanf("%lld", &tree[n + i]);
for (int i = n - 1; i > 0; i--)
tree[i] = tree[i << 1] + tree[i << 1 | 1];
for (int i = 0; i < m + k; i++) {
long long a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
if (a == 1) {
b += n - 1;
long long gap = c - tree[b];
tree[b] = c;
for (b >>= 1; b >= 1; b >>= 1) {
tree[b] += gap;
}
}
else {
long long sum = 0;
for (b += n - 1, c += n; b < c; b >>= 1, c >>= 1) {
if (b & 1) sum += tree[b++];
if (c & 1) sum += tree[--c];
}
printf("%lld\n", sum);
}
}
}
|
cs |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 15562 네트워크 (0) | 2021.01.04 |
---|---|
[백준] 18233 러버덕을 사랑하는 모임 (0) | 2021.01.03 |
[백준] 1867 돌멩이 제거 (0) | 2020.12.31 |
[백준] 1208 부분수열의 합 2 (0) | 2020.12.29 |
[백준] 2315 가로등 끄기 (0) | 2020.12.29 |