※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts