結果
| 問題 |
No.2273 一点乗除区間積
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er