結果
| 問題 |
No.3059 Range Tournament
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-07-07 19:36:35 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,757 ms / 4,000 ms |
| コード長 | 2,330 bytes |
| コンパイル時間 | 458 ms |
| コンパイル使用メモリ | 82,460 KB |
| 実行使用メモリ | 200,336 KB |
| 最終ジャッジ日時 | 2024-07-07 19:37:19 |
| 合計ジャッジ時間 | 38,258 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 27 |
ソースコード
class SparseTableBase_:
def ope(self, l, r):
raise NotImplementedError
def __init__(self, A):
self.n = len(A)
self.logn = (self.n - 1).bit_length()
if self.n == 1:
self.logn = 1
self.table = [0] * (self.logn * self.n)
for i in range(self.n):
self.table[i] = A[i]
for i in range(1, self.logn):
ma = self.n - (1 << i) + 1
d = 1 << (i - 1)
for j in range(ma):
self.table[i * self.n + j] = self.ope(
self.table[(i - 1) * self.n + j],
self.table[(i - 1) * self.n + j + d],
)
self.look = [0] * self.n
for i in range(2, self.n):
self.look[i] = self.look[i >> 1] + 1
def prod(self, l, r):
assert l < r
d = r - l
if d == 1:
return self.table[l]
logn = self.look[d - 1]
return self.ope(
self.table[logn * self.n + l], self.table[logn * self.n + r - (1 << logn)]
)
class RangeMax(SparseTableBase_):
def ope(self, l, r):
return max(l, r)
n = int(input())
P = list(map(int, input().split()))
for i in range(n):
P[i] -= 1
Q = int(input())
imos = [[0] * (2 * n) for _ in range(20)]
ans = [0] * n
st = RangeMax(P)
for _ in range(Q):
l, r = map(int, input().split())
l -= 1
d = r - l
rle = [(1, d)]
k = d - 1
p = 0
minus = 0
while k > 0:
c = (rle[p][1] - minus) // 2
minus = rle[p][1] - minus - 2 * c
if c != 0:
rle.append((rle[p][0] * 2, c))
k -= c
if minus == 1:
k -= 1
rle.append((rle[p][0] + rle[p + 1][0], 1))
p += 1
s = 0
for c, t in rle[1:]:
l_ = s
r_ = s + c * t
if r_ <= d:
imos[c.bit_length() - 1][l + l_] += 1
imos[c.bit_length() - 1][l + r_] -= 1
else:
ma1 = st.prod(l + l_, r)
ma2 = st.prod(l, l + (r_ - d))
ma = max(ma1, ma2)
ans[ma] += 1
s = r_ % d
for i in range(1, 20):
d = 1 << i
for j in range(d, n):
imos[i][j] += imos[i][j - d]
for j in range(n - d + 1):
res = st.prod(j, j + d)
ans[res] += imos[i][j]
print(*ans, sep="\n")