https://www.acmicpc.net/problem/1275
수열의 성분이 빈번하게 바뀌면서, 구간합을 물어보는 문제이기 때문에 인덱스 트리를 구현해주면 된다.
인덱스 트리에 대한 좀 더 자세한 설명은 https://hugssy.tistory.com/132 를 참고하면 된다.
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll idxTree[4 * 100002]; ll findSum(int st, int en) { ll ret = 0; while (st <= en) { if (st % 2 == 1) ret += idxTree[st]; if (en % 2 == 0) ret += idxTree[en]; st = (st + 1) / 2; en = (en - 1) / 2; } return ret; } void Update(int idx, ll delta) { while (idx > 0) { idxTree[idx] += delta; idx /= 2; } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; int start = 1; while (start < n) start *= 2; //n보다 큰 가장 작은 2의 제곱수 for (int i = 0; i < n; i++) cin >> idxTree[i + start]; for (int i = start - 1; i >= 1; i--) idxTree[i] = idxTree[2 * i] + idxTree[2 * i + 1]; while (q--) { int x, y, a, b; cin >> x >> y >> a >> b; if (x > y) swap(x, y); cout << findSum(x + start - 1, y + start - 1) << '\n'; Update(a + start - 1, b - idxTree[a + start - 1]); } return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 10451 순열 사이클 C++ (0) | 2019.08.14 |
---|---|
백준 2243 사탕상자 C++ (0) | 2019.08.14 |
백준 5639 이진 검색 트리 C++ (0) | 2019.08.14 |
백준 6416 트리인가? C++ (0) | 2019.08.13 |
백준 2042번 구간합 구하기 C++ (0) | 2019.08.13 |