結果
問題 | No.1558 Derby Live |
ユーザー |
![]() |
提出日時 | 2021-06-25 21:44:29 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 530 ms / 2,000 ms |
コード長 | 3,363 bytes |
コンパイル時間 | 287 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 106,508 KB |
最終ジャッジ日時 | 2024-06-25 08:22:03 |
合計ジャッジ時間 | 17,629 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
class SegmentTree():def __init__(self, init, unitX, f):self.f = f # (X, X) -> Xself.unitX = unitXself.f = fif type(init) == int:self.n = initself.n = 1 << (self.n - 1).bit_length()self.X = [unitX] * (self.n * 2)else:self.n = len(init)self.n = 1 << (self.n - 1).bit_length()self.X = [unitX] * self.n + init + [unitX] * (self.n - len(init))for i in range(self.n-1, 0, -1):self.X[i] = self.f(self.X[i*2], self.X[i*2|1])def update(self, i, x):i += self.nself.X[i] = xi >>= 1while i:self.X[i] = self.f(self.X[i*2], self.X[i*2|1])i >>= 1def getvalue(self, i):return self.X[i + self.n]def getrange(self, l, r):l += self.nr += self.nal = self.unitXar = self.unitXwhile l < r:if l & 1:al = self.f(al, self.X[l])l += 1if r & 1:r -= 1ar = self.f(self.X[r], ar)l >>= 1r >>= 1return self.f(al, ar)# Find r s.t. calc(l, ..., r-1) = True and calc(l, ..., r) = Falsedef max_right(self, l, z):if l >= self.n: return self.nl += self.ns = self.unitXwhile 1:while l % 2 == 0:l >>= 1if not z(self.f(s, self.X[l])):while l < self.n:l *= 2if z(self.f(s, self.X[l])):s = self.f(s, self.X[l])l += 1return l - self.ns = self.f(s, self.X[l])l += 1if l & -l == l: breakreturn self.n# Find l s.t. calc(l, ..., r-1) = True and calc(l-1, ..., r-1) = Falsedef min_left(self, r, z):if r <= 0: return 0r += self.ns = self.unitXwhile 1:r -= 1while r > 1 and r % 2:r >>= 1if not z(self.f(self.X[r], s)):while r < self.n:r = r * 2 + 1if z(self.f(self.X[r], s)):s = self.f(self.X[r], s)r -= 1return r + 1 - self.ns = self.f(self.X[r], s)if r & -r == r: breakreturn 0def debug(self):print("debug")print([self.getvalue(i) for i in range(min(self.n, 20))])def iv(A):iA = [0] * Nfor i, a in enumerate(A):iA[a] = i + 1return iAdef fun(A):re = 0for i, a in enumerate(A):re += abs(i - a)return reimport sysinput = lambda: sys.stdin.readline().rstrip()N, M, Q = map(int, input().split())f = lambda x, y: [y[xx] for xx in x]unit = [i for i in range(N)]st = SegmentTree(M, unit, f)for _ in range(Q):qq = [int(a) for a in input().split()]if qq[0] == 1:i = qq[1] - 1A = [a - 1 for a in qq[2:]]st.update(i, A)elif qq[0] == 2:S = qq[1]re = st.getrange(0, S)print(*iv(re))else:l, r = qq[1], qq[2]re = st.getrange(l - 1, r)print(fun(re))