-
구간 합 구하기 - 2042Algorithm/BOJ 2020. 3. 15. 05:4912345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182//2042 - 구간 합 구하기#include <iostream>#include <vector>using namespace std;int N, M, K;long long arr[1000001];struct SegmentTree{int n;vector<long long> tree;SegmentTree(int n) : n(n), tree(4 * n + 1){init(1, n, 1);}long long init(int left, int right, int node){if (left == right)return tree[node] = arr[left];int mid = (left + right) / 2;return tree[node] = init(left, mid, node * 2) + init(mid + 1, right, node * 2 + 1);}long long query(int left, int right, int nodeLeft, int nodeRight, int node){if (right < nodeLeft || nodeRight < left)return 0;if (left <= nodeLeft && nodeRight <= right)return tree[node];int mid = (nodeLeft + nodeRight) / 2;return query(left, right, nodeLeft, mid, node * 2) + query(left, right, mid + 1, nodeRight, node * 2 + 1);}long long query(int left, int right){return query(left, right, 1, n, 1);}void update(int idx, long long val, int nodeLeft, int nodeRight, int node){if (nodeLeft == nodeRight && nodeLeft == idx){tree[node] += val;return;}if (nodeLeft <= idx && idx <= nodeRight){tree[node] += val;int mid = (nodeLeft + nodeRight) / 2;update(idx, val, nodeLeft, mid, node * 2);update(idx, val, mid + 1, nodeRight, node * 2 + 1);}}void update(int idx, long long val){update(idx, val, 1, n, 1);}};int main(){ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> N >> M >> K;for (int i = 1; i <= N; ++i)cin >> arr[i];SegmentTree sg(N);long long flag, x, y;for(int i = 0; i<M+K; ++i){cin >> flag >> x >> y;if(flag == 1)sg.update(x, y - arr[x]), arr[x] = y;elsecout << sg.query(x, y) << "\n";}}
cs 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번째 줄까지 N개의 수가 주어진다. 그리고 N+2번째 줄부터 N+M+K+1번째 줄까지 세 개의 정수 a, b, c가 주어지는데, a가 1인 경우 b번째 수를 c로 바꾸고 a가 2인 경우에는 b번째 수부터 c번째 수까지의
www.acmicpc.net
구간 합 구하기
세그먼트 트리를 이용해 해결했습니다.
'Algorithm > BOJ' 카테고리의 다른 글
두 로봇 - 15971 (0) 2020.03.15 *빛*영*우* - 15807 (0) 2020.03.15 영우의 기숙사 청소 - 15806 (0) 2020.03.15 내려가기 - 2096 (0) 2020.03.14 최솟값 - 10868 (0) 2020.03.13