diff --git a/g0rnn/README.md b/g0rnn/README.md index 9529a76..478f27f 100644 --- a/g0rnn/README.md +++ b/g0rnn/README.md @@ -32,5 +32,6 @@ | 28차시 | 2025.06.27 | BFS | [상어 중학교](https://www.acmicpc.net/problem/21609) | https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/115 | | 29차시 | 2025.07.22 | combination | [소문난 칠공주](https://www.acmicpc.net/problem/1941) | https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/119 | | 30차시 | 2025.07.28 | segment-tree | [커피숍2](https://www.acmicpc.net/problem/1275) | https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/121 | +| 31차시 | 2025.08.03 | segment-tree | [음주코딩](https://www.acmicpc.net/problem/5676) | https://github.com/AlgoLeadMe/AlgoLeadMe-12/pull/127 | --- diff --git a/g0rnn/segment-tree/31-g0rnn.py b/g0rnn/segment-tree/31-g0rnn.py new file mode 100644 index 0000000..bae7249 --- /dev/null +++ b/g0rnn/segment-tree/31-g0rnn.py @@ -0,0 +1,71 @@ +import sys +input = sys.stdin.readline + +def minimize(x): + if x > 0: + return 1 + elif x < 0: + return -1 + else: + return 0 + +def build(node, s, e): + if s == e: + tree[node] = minimize(nums[s]) + return + + mid = (s + e) // 2 + build(node * 2, s, mid) + build(node * 2 + 1, mid + 1, e) + tree[node] = tree[node * 2] * tree[node * 2 + 1] + +def update(node, s, e, i, v): + if s == e: + tree[node] = minimize(v) + return + + mid = (s + e) // 2 + if mid < i: + update(node*2 + 1, mid + 1, e, i, v) + else: + update(node*2, s, mid, i, v) + + tree[node] = tree[node * 2] * tree[node * 2 + 1] + +def query(node, s, e, i, j): + if j < s or e < i: + return 1 + if i <= s and e <= j: + return tree[node] + + mid = (s + e) // 2 + left = query(node*2,s, mid, i, j) + right = query(node*2 + 1, mid + 1, e, i, j) + return left * right + +while True: + try: + n, k = map(int, input().split()) + nums = list(map(int, input().split())) + tree = [0] * (4 * n) + + build(1, 0, n - 1) + + output = [] + for _ in range(k): + cmd, i, v = input().split() + i = int(i) + v = int(v) + if cmd == 'C': + update(1, 0, n-1, i - 1, v) + elif cmd == 'P': + result = query(1, 0, n-1, i - 1, v - 1) + if result > 0: + output.append('+') + elif result < 0: + output.append('-') + else: + output.append('0') + print(''.join(output)) + except: + break