반응형
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 49 50 51 52 53 | #include <iostream> using namespace std; long long a[1000000], tree[3000000]; int x1, x2, n, m, k; long long init(int node, int start, int end)//초기화 함수 { if (start == end) return tree[node] = a[start]; else return tree[node] = init(node * 2, start, (start + end) / 2) + init(node * 2 + 1, (start + end) / 2 + 1, end); } void update(int node, int start,int end, int i, long long diff)//차이만큼 더해준 정보에 더해줌 { if (i<start || i>end)return; tree[node] += diff; if (start != end) { update(node * 2, start, (start + end) / 2, i, diff); update(node * 2 + 1, (start + end) / 2 + 1, end, i, diff); } } long long sum(int node, int start, int end, int i, int j)//b,c가 다르면 b부터 c까지 구간을 더해줌 { if (i > end || j < start) { return 0; } if (i <= start && j >= end) { return tree[node]; } return sum(node * 2, start, (start + end) / 2, i, j) + sum(node * 2 + 1, (start + end) / 2 + 1, end, i, j); } int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++) scanf("%lld",&a[i]); init(1, 0, n - 1); m += k; while (m--) { scanf("%d", &x1); if (x1 == 1) { long long x3; scanf("%d %lld", &x2, &x3); long long diff = x3 - a[x2-1]; a[x2 - 1] = x3; update(1, 0, n - 1, x2-1, diff); } else if(x1==2) { int x3; scanf("%d %d", &x2, &x3); printf("%lld\n", sum(1, 0, n - 1, x2-1, x3-1)); } } } | cs |
'Algorithm' 카테고리의 다른 글
C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1707번:이분 그래프(DFS) 답 (0) | 2017.03.26 |
---|---|
C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 10867번:중복 빼고 정렬하기 답 (0) | 2017.03.26 |
C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 2745번:진법변환 답 (0) | 2017.03.22 |
C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 2774번:아름다운 수 답 (0) | 2017.03.21 |
(C++) - 백준(BOJ) 1356번 : 유진수 답 (0) | 2017.03.21 |