結果
問題 | No.2650 [Cherry 6th Tune *] セイジャク |
ユーザー |
|
提出日時 | 2024-02-23 23:07:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,394 ms / 2,500 ms |
コード長 | 2,832 bytes |
コンパイル時間 | 557 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 101,544 KB |
最終ジャッジ日時 | 2024-09-29 08:32:21 |
合計ジャッジ時間 | 31,204 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
# https://qiita.com/ether2420/items/7b67b2b35ad5f441d686def segfunc(x,y):return max(x, y)class LazySegTree_RUQ:def __init__(self,init_val,segfunc,ide_ele):n = len(init_val)self.segfunc = segfuncself.ide_ele = ide_eleself.num = 1<<(n-1).bit_length()self.tree = [ide_ele]*2*self.numself.lazy = [None]*2*self.numfor i in range(n):self.tree[self.num+i] = init_val[i]for i in range(self.num-1,0,-1):self.tree[i] = self.segfunc(self.tree[2*i],self.tree[2*i+1])def gindex(self,l,r):l += self.numr += self.numlm = l>>(l&-l).bit_length()rm = r>>(r&-r).bit_length()while r>l:if l<=lm:yield lif r<=rm:yield rr >>= 1l >>= 1while l:yield ll >>= 1def propagates(self,*ids):for i in reversed(ids):v = self.lazy[i]if v is None:continueself.lazy[i] = Noneself.lazy[2*i] = vself.lazy[2*i+1] = vself.tree[2*i] = vself.tree[2*i+1] = vdef update(self,l,r,x):ids = self.gindex(l,r)self.propagates(*self.gindex(l,r))l += self.numr += self.numwhile l<r:if l&1:self.lazy[l] = xself.tree[l] = xl += 1if r&1:self.lazy[r-1] = xself.tree[r-1] = xr >>= 1l >>= 1for i in ids:self.tree[i] = self.segfunc(self.tree[2*i], self.tree[2*i+1])def query(self,l,r):ids = self.gindex(l,r)self.propagates(*self.gindex(l,r))res = self.ide_elel += self.numr += self.numwhile l<r:if l&1:res = self.segfunc(res,self.tree[l])l += 1if r&1:res = self.segfunc(res,self.tree[r-1])l >>= 1r >>= 1return resimport bisectimport sysinput = sys.stdin.readlineN, A = map(int, input().split())X = list(map(int, input().split()))T = int(input())LR = [list(map(int, input().split())) for _ in range(T)]for i in range(N):x = X[i]X[i] = (x, i)X.sort()ST = LazySegTree_RUQ([0 for _ in range(N)], segfunc, 0)for t in range(T):l, r = LR[t]l_pos = bisect.bisect_left(X, (l, 0))r_pos = bisect.bisect_left(X, (r, N))if l_pos==r_pos:continueST.update(l_pos, r_pos, t+1)ans = [-1 for _ in range(N)]for i in range(N):tmp = ST.query(i, i+1)x, idx = X[i]if tmp==0:ans[idx] = -1else:ans[idx] = tmpfor a in ans:print(a)