반응형
https://www.acmicpc.net/problem/1275
#문제 간단 정리
세그먼트 트리 사용
일반적인 구간합 문제
#문제 해결 방법
세트 코드는
세그먼트 트리 C++ 코드
#include #include using namespace std;vector tree;vector a;int howmany;void build() { for (int i = 0; i 0; --i) { tree[i] = tree[i 1) { tree[where >> 1] = tree[where] + tree[where ^ 1]; where >>= 1; }}int query(int left, int right) { int sum = 0; left += h
dfdfg42.tistory.com
참조
x>y 일때 놓치지 말자
#전체 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<long long> tree;
vector<long long> a;
int N, Q;
// 세그먼트 트리 구축
void build() {
for (int i = 0; i < N; ++i) {
tree[N + i] = a[i];
}
for (int i = N - 1; i > 0; --i) {
tree[i] = tree[i << 1] + tree[i << 1 | 1];
}
}
// 세그먼트 트리의 특정 위치 값 업데이트
void updateTree(int where, long long value) {
where += N;
tree[where] = value;
while (where > 1) {
where >>= 1;
tree[where] = tree[where << 1] + tree[where << 1 | 1];
}
}
// 세그먼트 트리 구간 합 쿼리
long long query(int left, int right) {
long long sum = 0;
left += N;
right += N;
while (left <= right) {
if (left & 1) sum += tree[left++];
if (!(right & 1)) sum += tree[right--];
left >>= 1;
right >>= 1;
}
return sum;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> Q;
a.resize(N);
tree.resize(2 * N);
for (int i = 0; i < N; ++i) {
cin >> a[i];
}
build();
for (int i = 0; i < Q; ++i) {
int x, y, a_idx;
long long b;
cin >> x >> y >> a_idx >> b;
if (x > y) swap(x, y);
cout << query(x - 1, y - 1) << '\n';
updateTree(a_idx - 1, b);
}
return 0;
}
반응형
'[백준] > C++' 카테고리의 다른 글
백준 1786번 찾기 [C++] (0) | 2024.06.18 |
---|---|
백준 9742번 순열 [C++] (2) | 2024.06.18 |
백준 27498번 연애 혁명 [C++] (0) | 2024.06.06 |
백준 18352번 특정 거리의 도시 찾기 [C++] (0) | 2024.05.12 |
백준 9694번무엇을 아느냐가 아니라 누구를 아느냐가 문제다 [C++] (0) | 2024.05.11 |