結果
問題 | No.2306 [Cherry 5th Tune C] ウソツキタマシイ |
ユーザー |
|
提出日時 | 2023-05-19 21:55:56 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 230 ms / 2,000 ms |
コード長 | 1,809 bytes |
コンパイル時間 | 331 ms |
コンパイル使用メモリ | 82,464 KB |
実行使用メモリ | 92,160 KB |
最終ジャッジ日時 | 2024-12-18 02:37:56 |
合計ジャッジ時間 | 7,314 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 |
ソースコード
import sysinput = sys.stdin.readlinedef main():N, M = map(int, input().split())A = list(map(int, input().split()))Q = int(input())A_square = [a**2 for a in A]st = SegTree(A_square, op, 0)for _ in range(Q):c, k, d = map(int, input().split())c, d = c - 1, d - 1cn = int(st.get_value(c)**(1 / 2))dn = int(st.get_value(d)**(1 / 2))st.update(c, (cn - k)**2)st.update(d, (dn + k)**2)print(st.query(0, M))def op(x, y):return x + yclass SegTree:def __init__(self, ls, op, e):n = len(ls)self.op = opself.e = eself.size = 1 << (n - 1).bit_length()self.tree = [self.e] * (2 * self.size)# 葉に対象の列を格納for i in range(n):self.tree[self.size + i] = ls[i]# 葉に近い場所から順に更新for i in range(self.size - 1, 0, -1):self.tree[i] = self.op(self.tree[2 * i], self.tree[2 * i + 1])def update(self, k, x):# 葉に移動k += self.size# 関連する場所を更新self.tree[k] = xwhile k > 1:self.tree[k >> 1] = self.op(self.tree[k], self.tree[k ^ 1])k >>= 1def query(self, l, r):res = self.e# 葉に移動l += self.sizer += self.size# 未計算の区間がなくなるまでwhile l < r:if l & 1:res = self.op(res, self.tree[l])l += 1if r & 1:res = self.op(res, self.tree[r - 1])# 親に移動l >>= 1r >>= 1return resdef get_value(self, k):return self.tree[k + self.size]main()