結果
| 問題 |
No.1332 Range Nearest Query
|
| コンテスト | |
| ユーザー |
penguinman
|
| 提出日時 | 2020-11-04 06:51:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,359 ms / 2,500 ms |
| コード長 | 3,539 bytes |
| コンパイル時間 | 200 ms |
| コンパイル使用メモリ | 82,068 KB |
| 実行使用メモリ | 166,308 KB |
| 最終ジャッジ日時 | 2024-07-22 10:42:26 |
| 合計ジャッジ時間 | 40,577 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 48 |
ソースコード
# Refernce: https://atcoder.jp/contests/practice2/submissions/16814531
class SegTree():
def __init__(self, a, func, idem):
# the number of nodes is 2n - 1
self.n = 1 << len(a).bit_length()
self.size = len(a)
self.func = func
self.idem = idem # Identity element
self.node = [idem] * (2 * self.n - 1)
for i in range(len(a) + self.n - 2, -1, -1):
if i >= self.n - 1:
self.node[i] = a[i - self.n + 1]
else:
self.node[i] = self.func(self.node[2 * i + 1], self.node[2 * i + 2])
def get(self, x):
return self.node[x + self.n - 1]
def set(self, x, val):
x += self.n - 1
self.node[x] = val
while x > 0:
x = (x - 1) >> 1
self.node[x] = self.func(self.node[2*x+1], self.node[2*x+2])
return
def prod(self, l, r):
L, R = l + self.n, r + self.n
s_l, s_r = self.idem, self.idem
while L < R:
if R & 1:
R -= 1
s_r = self.func(self.node[R-1], s_r)
if L & 1:
s_l = s_l = self.func(s_l, self.node[L-1])
L += 1
L >>= 1
R >>= 1
return self.func(s_l, s_r)
def max_right(self, l, val):
if l == self.size:
return self.size
L = l + self.n
s = self.idem
while 1:
while L % 2 == 0:
L >>= 1
if not val(self.func(s, self.node[L - 1])):
while L < self.n:
L <<= 1
if val(self.func(s, self.node[L-1])):
s = self.func(s, self.node[L-1])
L += 1
return L - self.n
s = self.func(s, self.node[L - 1])
L += 1
if (L & -L) == L:
return self.size
def min_left(self, r, val):
if r == 0:
return 0
R = r + self.n
s = self.idem
while True:
R -= 1
while R > 1 and R % 2:
R >>= 1
if not val(self.func(self.node[R - 1], s)):
while R < self.n:
R = (R << 1) + 1
if val(self.func(self.node[R - 1], s)):
s = self.func(self.node[R - 1], s)
R -= 1
return R + 1 - self.n
s = self.func(self.node[R - 1], s)
if (R & -R) == R:
return 0
import sys
input=sys.stdin.readline
import bisect
inf=int(1e9)
N=int(input())
A=[-inf]*N
X=list(map(int,input().split()))
Q=int(input())
ind=[[]for i in range(N)]
lef=[[]for i in range(N)]
po=[[]for i in range(N)]
for i in range(Q):
l,r,x=map(int, input().split())
ind[r-1].append(i)
lef[r-1].append(l-1)
po[r-1].append(x)
ans=[inf]*Q
seg=SegTree(A,max,-inf)
Y=sorted(X)
for i in range(N):
p=bisect.bisect_left(Y,X[i])
seg.set(p,i)
for j in range(len(ind[i])):
index=ind[i][j]
left=lef[i][j]
point=po[i][j]
right=i
now=bisect.bisect_left(Y,point)
index2=seg.max_right(now,lambda z: z<left)
if index2<N and index2>=0 and ans[index]>Y[index2]-point:
ans[index]=Y[index2]-point
index2=seg.min_left(now,lambda z: z<left)
index2-=1
if index2<N and index2>=0 and ans[index]>point-Y[index2]:
ans[index]=point-Y[index2]
for i in range(Q):
print(ans[i])
penguinman