結果
問題 |
No.2395 区間二次変換一点取得
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:50:03 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 316 ms / 2,000 ms |
コード長 | 1,426 bytes |
コンパイル時間 | 185 ms |
コンパイル使用メモリ | 82,716 KB |
実行使用メモリ | 119,424 KB |
最終ジャッジ日時 | 2025-03-31 17:50:48 |
合計ジャッジ時間 | 5,314 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
class BIT: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) # 1-based indexing def add(self, idx, val): while idx <= self.n: self.tree[idx] += val idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res += self.tree[idx] idx -= idx & -idx return res def range_add(self, l, r, val): self.add(l, val) self.add(r + 1, -val) def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr +=1 B = int(input[ptr]) ptr +=1 Q = int(input[ptr]) ptr +=1 queries = [] for _ in range(Q): L = int(input[ptr]) ptr +=1 M = int(input[ptr]) ptr +=1 R = int(input[ptr]) ptr +=1 queries.append( (L, M, R) ) bit = BIT(N) for L, M, R in queries: bit.range_add(L, R, 1) k = bit.query(M) # Compute X x = (1 + k) % B if B == 1: x = 0 # Compute Z if k == 0: z = 1 % B else: z = pow(3, k, B) # Compute Y if k == 0: y = 1 % B else: pow3 = pow(3, k - 1, B) term = (k * k + 3 * k + 3) % B y = (pow3 * term) % B print(f"{x} {y} {z}") if __name__ == '__main__': main()