結果
問題 | No.875 Range Mindex Query |
ユーザー |
|
提出日時 | 2021-02-06 04:35:33 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,619 ms / 2,000 ms |
コード長 | 2,496 bytes |
コンパイル時間 | 254 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 24,324 KB |
最終ジャッジ日時 | 2024-07-02 14:47:50 |
合計ジャッジ時間 | 11,881 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
class SegmentTree:def __init__(self, init, op, e):"""init : int か listop : min, +, *, xor, gcd などe : 単位元(min:inf, 和:0, 積:1, xor:0, gcd:0)"""self.op = opself.e = eif isinstance(init, int):self.size = 1 << (init - 1).bit_length()self.seg = [e] * (2 * self.size)else:n = len(init)self.size = 1 << (n - 1).bit_length()self.seg = [e] * (2 * self.size)seg = self.segfor i, e in enumerate(init):seg[i + self.size] = efor i in range(self.size - 1, 0, -1):seg[i] = op(seg[2 * i], seg[2 * i + 1])def __getitem__(self, k):return self.seg[k + self.size]def __setitem__(self, k, x):return self.set(k, x)def set(self, k, x):"""k番目の要素の値をxに変更"""k += self.sizeseg = self.segseg[k] = xwhile k > 1:k >>= 1seg[k] = self.op(seg[2 * k], seg[2 * k + 1])def prod(self, l, r):"""op(a[l], ..., a[r - 1])"""l += self.size; r += self.sizes = self.ewhile l < r:if r & 1:r -= 1s = self.op(s, self.seg[r])if l & 1:s = self.op(s, self.seg[l])l += 1l >>= 1r >>= 1return sdef all_prod(self):return self.seg[1]def update(self, k, x):"""k番目の要素の値をop(seg[k], x)に更新"""self.set(k, self.op(self[k], x))def debug(self):n = len(self.seg).bit_length()res = []k = 1for _ in range(1, n + 1):res.append(" ".join(map(str, self.seg[k:2 * k])))k *= 2k //= 2print("-" * k)print("\n".join(res))print("-" * k)def __repr__(self):return " ".join(map(str, self.seg[self.size:]))import sysinput = sys.stdin.readlinen, q = map(int, input().split())a = [e * n + i for i, e in enumerate(map(int, input().split()))]seg = SegmentTree(a, min, 10 ** 18)res = []for _ in range(q):query, l, r = map(int, input().split())if query == 1:s, t = seg[l - 1], seg[r - 1]s += r - l; t += l - rseg[l - 1], seg[r - 1] = t, selse:res.append(seg.prod(l - 1, r) % n + 1)print(*res, sep="\n")