結果
問題 |
No.2273 一点乗除区間積
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:48:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,791 ms / 5,000 ms |
コード長 | 2,138 bytes |
コンパイル時間 | 287 ms |
コンパイル使用メモリ | 82,284 KB |
実行使用メモリ | 134,720 KB |
最終ジャッジ日時 | 2025-03-20 18:49:17 |
合計ジャッジ時間 | 8,430 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 25 |
ソースコード
class SegTree: def __init__(self, data, mod_val): self.n = len(data) self.mod = mod_val self.size = 1 while self.size < self.n: self.size <<= 1 self.tree = [1] * (2 * self.size) for i in range(self.n): self.tree[self.size + i] = data[i] % self.mod for i in range(self.size - 1, 0, -1): self.tree[i] = (self.tree[2 * i] * self.tree[2 * i + 1]) % self.mod def update(self, pos, value): pos += self.size self.tree[pos] = value % self.mod pos >>= 1 while pos >= 1: new_val = (self.tree[2 * pos] * self.tree[2 * pos + 1]) % self.mod if self.tree[pos] == new_val: break self.tree[pos] = new_val pos >>= 1 def query(self, l, r): res = 1 l_pos = l + self.size r_pos = r + self.size + 1 # convert to [l, r+1) for half-open interval while l_pos < r_pos: if l_pos % 2 == 1: res = (res * self.tree[l_pos]) % self.mod l_pos += 1 if r_pos % 2 == 1: r_pos -= 1 res = (res * self.tree[r_pos]) % self.mod l_pos >>= 1 r_pos >>= 1 return res def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) B = int(data[idx+1]) Q = int(data[idx+2]) idx +=3 val = list(map(int, data[idx:idx+N])) idx += N mod = [x % B for x in val] seg = SegTree(mod, B) for _ in range(Q): j = int(data[idx]) m = int(data[idx+1]) l = int(data[idx+2]) r = int(data[idx+3]) idx +=4 current_val = val[j] if current_val % B == 0 and m == B: new_val = current_val // B else: new_val = current_val * m val[j] = new_val new_mod = new_val % B if mod[j] != new_mod: mod[j] = new_mod seg.update(j, new_mod) product_mod = seg.query(l, r) print(product_mod) if __name__ == '__main__': main()