문제 원본 : https://www.acmicpc.net/problem/2042
2042번: 구간 합 구하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄
www.acmicpc.net


#include <iostream>
#include <vector>
using namespace std;
long long n[1000000];
long long arr[4000000];
long long init(int node, int l, int r) {
if (l == r) {
return arr[node] = n[l];
}
int mid = (l + r) / 2;
return arr[node] = init(node * 2, l, mid) + init(node * 2 + 1, mid + 1, r);
}
long long query(int l, int r, int node, int nl, int nr) {
if (r<nl || l>nr) {
return 0;
}
if (l<=nl && nr <= r) {
return arr[node];
}
int mid = (nl + nr) / 2;
return query(l, r, node * 2, nl, mid) + query(l, r, node * 2 + 1, mid + 1, nr);
}
long long update(int index, long long newValue, int node, int l, int r) {
if (index < l || index > r) {
return arr[node];
}
if (l == r) {
return arr[node] = newValue;
}
int mid = (l + r) / 2;
return arr[node] = update(index, newValue, node * 2, l, mid) + update(index, newValue, node * 2 + 1, mid + 1, r);
}
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
long long N, M, K;
long long a, b, c;
cin >> N >> M >> K;
for (int i = 0; i < N; ++i) {
cin >> n[i];
}
init(1, 0, N - 1);
for (int i = 0; i < M + K; ++i) {
cin >> a >> b >> c;
if (a == 1) {
update(b - 1, c, 1, 0, N - 1);
}
else {
cout << query(b - 1, c - 1, 1, 0, N - 1) << "\n";
}
}
}
- 세그먼트 트리 기본
'알고리즘 > BOJ' 카테고리의 다른 글
| [BOJ] 17136. 색종이 붙이기 (0) | 2022.02.15 |
|---|---|
| [BOJ] 16137. 견우와 직녀 (0) | 2022.02.10 |
| [BOJ] 2749. 피보나치 수 3 (0) | 2022.02.09 |
| [BOJ] 17837. 새로운 게임 2 (0) | 2022.02.07 |
| [BOJ] 3197. 백조의 호수 (0) | 2022.02.06 |