結果
| 問題 | No.3446 Range Adjacent Differences |
| ユーザー |
kidodesu
|
| 提出日時 | 2026-02-11 22:38:12 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,499 bytes |
| 記録 | |
| コンパイル時間 | 211 ms |
| コンパイル使用メモリ | 82,220 KB |
| 実行使用メモリ | 225,728 KB |
| 最終ジャッジ日時 | 2026-02-18 20:50:47 |
| 合計ジャッジ時間 | 5,298 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 25 |
ソースコード
from math import isqrt
from collections import defaultdict
D = [0] * 2 * (10 ** 7 + 1)
X = [[0 for _ in range(1<<i*6)] for i in range(4)]
Y = [[0 for _ in range(1<<i*6)] for i in range(4)]
def add(Z, a):
for i in range(3, -1, -1):
a0 = a & 63
a >>= 6
Z[i][a] |= 1 << a0
return
def dec(Z, a):
for i in range(3, -1, -1):
a0 = a & 63
a >>= 6
Z[i][a] ^= 1 << a0
if Z[i][a]:
break
return
def bsl(Z, a):
a += 1
for i in range(3, -1, -1):
if Z[i][a >> 6] & (1 << (a & 63)) - 1:
rep = ((a >> 6) << 6) | (Z[i][a >> 6] & (1 << (a & 63)) - 1).bit_length()-1
break
a >>= 6
else:
return -1
for j in range(i+1, 4):
rep = (rep << 6) | Z[j][rep].bit_length()-1
return rep
def bsr(Z, a):
a -= 1
for i in range(3, -1, -1):
ma = 0
if a & 63 != 63:
ma = ~((1 << ((a&63)+1)) - 1)
if Z[i][a >> 6] & ma:
x = Z[i][a >> 6] & ma
rep = ((a >> 6) << 6) | (x & -x).bit_length()-1
break
a >>= 6
else:
return -1
for j in range(i+1, 4):
rep = (rep << 6) | (Z[j][rep] & -Z[j][rep]).bit_length()-1
return rep
n, q = list(map(int, input().split()))
Ans = [-1] * q
A = list(map(int, input().split()))
Q_size = isqrt(n)
Q_cnt = (n + Q_size - 1) // Q_size
Q = [[] for _ in range(Q_cnt)]
for _ in range(q):
*P, c = list(map(str, input().split()))
l, r, x = list(map(int, P))
l -= 1
if c == "L":
t = 0
else:
t = 1
Q[l // Q_size].append((t, l, r, x, _))
for qi in range(Q_cnt):
if not qi % 2:
Q[qi].sort(key = lambda x: x[2])
else:
Q[qi].sort(key = lambda x: -x[2])
def f0(a):
D[a] += 1
if 1 < D[a]:
global cnt0
cnt0 += 1
return
al = bsl(X, a)
ar = bsr(X, a)
add(X, a)
if al == -1 and ar == -1:
pass
elif ar == -1:
D[al-a] += 1
if D[al-a] == 1:
add(Y, a-al)
elif al == -1:
D[a-ar] += 1
if D[a-ar] == 1:
add(Y, ar-a)
else:
D[al-ar] -= 1
if D[al-ar] == 0:
dec(Y, ar-al)
D[a-ar] += 1
if D[a-ar] == 1:
add(Y, ar-a)
D[al-a] += 1
if D[al-a] == 1:
add(Y, a-al)
def f1(a):
D[a] -= 1
if D[a]:
global cnt0
cnt0 -= 1
return
dec(X, a)
al = bsl(X, a)
ar = bsr(X, a)
if al == -1 and ar == -1:
pass
elif ar == -1:
D[al-a] -= 1
if D[al-a] == 0:
dec(Y, a-al)
elif al == -1:
D[a-ar] -= 1
if D[a-ar] == 0:
dec(Y, ar-a)
else:
D[al-ar] += 1
if D[al-ar] == 1:
add(Y, ar-al)
D[a-ar] -= 1
if D[a-ar] == 0:
dec(Y, ar-a)
D[al-a] -= 1
if D[al-a] == 0:
dec(Y, a-al)
nl = nr = 0
cnt0 = 0
for qi in range(Q_cnt):
for t, l, r, x, idx in Q[qi]:
while l < nl:
nl -= 1
f0(A[nl])
while nr < r:
f0(A[nr])
nr += 1
while nl < l:
f1(A[nl])
nl += 1
while r < nr:
nr -= 1
f1(A[nr])
if not t:
Ans[idx] = bsl(Y, x)
if cnt0:
Ans[idx] = max(Ans[idx], 0)
else:
Ans[idx] = bsr(Y, x)
for ans in Ans:
print(ans)
kidodesu