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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include <stdio.h>#define SUM(x,y) ((x)+(y))int N, Q;int tree[1 << 17];int maps[200000];void update(int node, int s, int e, int idx, int add_data) { int m; if (s == e) { tree[node] += add_data; return; } m = (s + e) / 2; if (idx <= m) update(node * 2, s, m, idx, add_data); else update(node * 2 + 1, m+1, e, idx, add_data); tree[node] = SUM(tree[node * 2], tree[node * 2 + 1]);}void add(int node, int s, int e, int idx, int data) { int m; if (s == e) { tree[node] = data; return; } m = (s + e) / 2; // 왼쪽 구간 if (idx <= m) add(node * 2, s, m, idx, data); // 오른쪽 구간 else add(node * 2 + 1, m + 1, e, idx, data); tree[node] = SUM(tree[node * 2], tree[node * 2 + 1]);}int query(int node, int rs, int re, int qs, int qe) { int m, l, r; if (qs <= rs && re <= qe) return tree[node]; if (qs > re || rs > qe) return 0; m = (rs + re) / 2; l = query(node * 2, rs, m, qs, qe); r = query(node * 2 + 1, m + 1, re, qs, qe); return SUM(l, r);}int main() { //freopen("input.txt", "r", stdin); int i, num, qs, qe, idx, add_data; scanf("%d %d", &N, &Q); for (i = 1; i <= N; i++) { scanf("%d", &num); add(1, 1, N, i, num); } for (i = 1; i <= Q; i++) { scanf("%d %d %d %d", &qs, &qe, &idx, &add_data); printf("%d\n",query(1, 1, N, qs, qe)); update(1, 1, N, idx, add_data); } return 0;}/************************************************************** Problem: 2861 User: AXQ6548 Language: C Result: Accepted Time:259 ms Memory:2376 kb****************************************************************/ |
'공부 > Algorithm' 카테고리의 다른 글
| Binary search (0) | 2018.07.09 |
|---|---|
| Heap으로 구현한 Priority Queue (0) | 2018.07.09 |
| MergeSort (2) | 2018.07.09 |
| Heap Sort (1) | 2018.07.09 |
| [BFS] 완전탐색하여 최단 비용 구하기 - 자외선 차단하기 (0) | 2018.05.07 |