※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2268번 문제인 수들의 합 7이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2268
2268번: 수들의 합 7
첫째 줄에는 N(1 ≤ N ≤ 1,000,000), M(1 ≤ M ≤ 1,000,000)이 주어진다. M은 수행한 명령의 개수이며 다음 M개의 줄에는 수행한 순서대로 함수의 목록이 주어진다. 첫 번째 숫자는 어느 함수를 사용했는
www.acmicpc.net
세그먼트트리(또는 펜윅트리)를 이용한 구간합 기본문제이다. 글쓴이는 세그먼트트리를 구현하여 문제를 해결하였다.
지문에 i>j인 경우에 대한 내용이 적혀있으므로, 해당 내용을 놓치지 않고 구현해주자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <utility>
using namespace std;
typedef long long ll;
int N, M;
ll seg[2097153];
ll update(int L, int R, int qI, int qVal, int sI) {
if (qI < L || R < qI) return seg[sI];
if (L == R) return seg[sI] = qVal;
return seg[sI] = update(L, (L + R) / 2, qI, qVal, sI * 2) + update((L + R) / 2 + 1, R, qI, qVal, sI * 2 + 1);
}
ll rangesum(int L, int R, int qL, int qR, int sI) {
if (R < qL || qR < L) return 0;
if (qL <= L && R <= qR) return seg[sI];
return rangesum(L, (L + R) / 2, qL, qR, sI * 2) + rangesum((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
while (M--) {
int q, i, j; cin >> q >> i >> j;
if (q) update(1, N, i, j, 1);
else {
if (i > j) swap(i, j);
cout << rangesum(1, N, i, j, 1) << '\n';
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25330 // C++] SHOW ME THE DUNGEON (0) | 2023.04.08 |
---|---|
[BOJ 25332 // C++] 수들의 합 8 (0) | 2023.04.07 |
[BOJ 1821 // C++] 수들의 합 6 (0) | 2023.04.05 |
[BOJ 2018 // C++] 수들의 합 5 (0) | 2023.04.04 |
[BOJ 2015 // C++] 수들의 합 4 (0) | 2023.04.03 |