結果
| 問題 |
No.2220 Range Insert & Point Mex
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2023-02-18 00:31:44 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 454 ms / 2,000 ms |
| コード長 | 3,263 bytes |
| コンパイル時間 | 417 ms |
| コンパイル使用メモリ | 82,556 KB |
| 実行使用メモリ | 212,872 KB |
| 最終ジャッジ日時 | 2024-07-21 12:56:53 |
| 合計ジャッジ時間 | 11,783 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
import sys
# sys.setrecursionlimit(200005)
int1 = lambda x: int(x)-1
pDB = lambda *x: print(*x, end="\n", file=sys.stderr)
p2D = lambda x: print(*x, sep="\n", end="\n\n", file=sys.stderr)
def II(): return int(sys.stdin.readline())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LI1(): return list(map(int1, sys.stdin.readline().split()))
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
def SI(): return sys.stdin.readline().rstrip()
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0)]
dij = [(0, 1), (-1, 0), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
inf = (1 << 63)-1
# inf = (1 << 31)-1
# md = 10**9+7
md = 998244353
from collections import defaultdict
class DualSegTree:
def __init__(self, op, e, v):
self._op = op
self._e = e()
if isinstance(v, int): v = [self._e]*v
self._n = len(v)
self._log = (self._n-1).bit_length()
self._size = 1 << self._log
self._d = [self._e]*(2*self._size)
for i in range(self._n):
self._d[self._size+i] = v[i]
def apply(self, left, right, f):
assert 0 <= left <= right <= self._n
if left == right: return
left += self._size
right += self._size
for i in range(self._log, 0, -1):
if ((left >> i) << i) != left:
self._push(left >> i)
if ((right >> i) << i) != right:
self._push((right-1) >> i)
while left < right:
if left & 1:
self._d[left] = self._op(self._d[left], f)
left += 1
if right & 1:
right -= 1
self._d[right] = self._op(self._d[right], f)
left >>= 1
right >>= 1
def get(self, p):
assert 0 <= p < self._n
p += self._size
res = self._e
while p:
res = self._op(res, self._d[p])
p >>= 1
return res
def all_array(self):
res = []
for i in range(self._n):
res.append(self.get(i))
return res
def _push(self, k):
self._d[k*2] = self._op(self._d[k*2], self._d[k])
self._d[k*2+1] = self._op(self._d[k*2+1], self._d[k])
self._d[k] = self._e
def e():return inf
n=II()
alr=defaultdict(list)
dec=set([0])
mx=0
for _ in range(n):
l,r,a=LI()
r+=1
alr[a].append((l,r))
dec.add(l)
dec.add(r)
mx=max(mx,r)
q=II()
xx=LI()
mx=max(mx,xx[-1])
dec.add(mx+1)
dec|=set(xx)
dec=sorted(dec)
enc={a:i for i,a in enumerate(dec)}
aa=sorted(alr)
for i,a in enumerate(aa):
if i!=a:break
alr[a].sort(key=lambda x:x[0])
L=R=-1
cur=[(0,0)]
for l,r in alr[a]:
if L==-1:
L,R=l,r
elif R<l:
cur.append((L,R))
L,R=l,r
elif r>R:
R=r
cur.append((L,R))
cur.append((mx+1,mx+1))
alr[a]=cur
m=len(dec)
st=DualSegTree(min,e,m)
last=-1
for i,a in enumerate(aa):
if i!=a:break
last=a
pr=-1
for l,r in alr[a]:
l,r=enc[l],enc[r]
if pr>-1:st.apply(pr,l,a)
pr=r
for x in xx:
x=enc[x]
ans=st.get(x)
if ans==inf:ans=last+1
print(ans)
mkawa2