結果
| 問題 |
No.2223 Merged Med
|
| コンテスト | |
| ユーザー |
stoq
|
| 提出日時 | 2023-02-16 06:57:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 4,932 ms / 7,000 ms |
| コード長 | 2,342 bytes |
| コンパイル時間 | 347 ms |
| コンパイル使用メモリ | 82,408 KB |
| 実行使用メモリ | 290,940 KB |
| 最終ジャッジ日時 | 2024-07-19 11:54:11 |
| 合計ジャッジ時間 | 78,348 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
from collections import deque
def main():
n, q = map(int, input().split())
# ---------------segtree---------------
SIZE = 1 << 17
LOG = 17
d = [(0, 0, 0, 0) for _ in range(SIZE * 2)]
# (lmax, rmax, max, sum)
def op(s, t):
return (max(s[0], s[3] + t[0]), max(t[1], s[1] + t[3]),
max(s[2], t[2], s[1] + t[0]), s[3] + t[3])
def seg_init():
for i in range(n):
d[SIZE + i] = (1, 1, 1, 1)
for i in range(SIZE - 1, 0, -1):
seg_update(i)
def seg_prod(l, r):
# assert 0 <= l and l <= r and r <= self.n
sml = (0, 0, 0, 0)
smr = (0, 0, 0, 0)
l += SIZE
r += SIZE
while l < r:
if l & 1:
sml = op(sml, d[l])
l += 1
if r & 1:
smr = op(d[r - 1], smr)
r -= 1
l >>= 1
r >>= 1
return op(sml, smr)
def seg_set(p, x):
# assert 0 <= p and p < n
p += SIZE
d[p] = x
for i in range(1, LOG + 1):
seg_update(p >> i)
def seg_update(k):
d[k] = op(d[2 * k], d[2 * k + 1])
# ---------------segtree---------------
a = list(map(int, input().split()))
for i in range(n):
a[i] -= 1
l = []
r = []
for _ in range(q):
li, ri = map(int, input().split())
l.append(li - 1)
r.append(ri)
p = [(a[i], i) for i in range(n)]
p.sort()
lo = [-1] * q
hi = [n] * q
mi_num = [deque() for _ in range(n)]
for i in range(q):
mi_num[(lo[i] + hi[i]) >> 1].append(i)
ans_cnt = 0
while ans_cnt < q:
seg_init()
for mi in range(n):
seg_set(p[mi][1], (-1, -1, -1, -1))
while len(mi_num[mi]) > 0:
i = mi_num[mi].popleft()
s = seg_prod(l[i], r[i])
if s[3] < 0 or s[3] - s[2] + 1 < 0:
hi[i] = mi
else:
lo[i] = mi
if hi[i] - lo[i] > 1:
mi_num[lo[i] + ((hi[i] - lo[i]) >> 1)].append(i)
else:
ans_cnt += 1
for i in range(q):
print(p[hi[i]][0] + 1)
main()
stoq