結果
問題 | No.1332 Range Nearest Query |
ユーザー |
![]() |
提出日時 | 2024-08-15 05:42:03 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,368 bytes |
コンパイル時間 | 152 ms |
コンパイル使用メモリ | 82,444 KB |
実行使用メモリ | 217,560 KB |
最終ジャッジ日時 | 2024-08-15 05:42:36 |
合計ジャッジ時間 | 6,887 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 13 TLE * 5 -- * 30 |
ソースコード
from collections import defaultdictclass Segment_Tree:def __init__(self,N,f,e,lst=None,dynamic=False,bisect_search=True):self.f=fself.e=eself.N=Nself.bisect_search=bisect_searchif self.bisect_search:self.le=1while self.le<self.N:self.le*=2else:self.le=self.Nif dynamic:self.segment_tree=defaultdict(lambda:self.e)else:if lst==None:self.segment_tree=[self.e]*2*self.leelse:assert len(lst)<=self.leself.segment_tree=[self.e]*self.le+[x for x in lst]+[self.e]*(self.le-len(lst))for i in range(self.le-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def __getitem__(self,i):return self.segment_tree[i+self.le]def __setitem__(self,i,x):i+=self.leself.segment_tree[i]=xwhile i>1:i>>= 1self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Build(self,lst):for i,x in enumerate(lst,self.le):self.segment_tree[i]=xfor i in range(self.le-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Fold(self,L,R):L+=self.leR+=self.levL=self.evR=self.ewhile L<R:if L&1:vL=self.f(vL,self.segment_tree[L])L+=1if R&1:R-=1vR=self.f(self.segment_tree[R],vR)L>>=1R>>=1return self.f(vL,vR)def Fold_Index(self,L=None,R=None):if L==None:L=self.leelse:assert 0<=L<=self.leL+=self.leif R==None:R=self.le*2else:assert 0<=R<=self.leR+=self.leif L==R:return Nonex=self.Fold(L-self.le,R-self.le)while L<R:if L&1:if self.segment_tree[L]==x:i=LbreakL+=1if R&1:R-=1if self.segment_tree[R]==x:i=RbreakL>>=1R>>=1while i<self.le:if self.segment_tree[i]==self.segment_tree[i<<1]:i<<=1else:i<<=1i|=1i-=self.lereturn idef Bisect_Right(self,L=None,f=None):assert self.bisect_searchif L==self.le:return self.leif L==None:L=0assert 0<=L<=self.leL+=self.levl=self.evr=self.el,r=L,self.le*2while l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return self.Nv=self.ewhile True:while L%2==0:L>>=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1else:while L<self.le:L<<=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1return L-self.ledef Bisect_Left(self,R=None,f=None):assert self.bisect_searchif R==0:return 0if R==None:R=self.leassert 0<=R<=self.leR+=self.levl=self.evr=self.el,r=self.le,Rwhile l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return 0v=self.ewhile True:R-=1while R>1 and R%2:R>>=1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvelse:while R<self.le:R=2*R+1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvR-=1return R+1-self.ledef __str__(self):return "["+", ".join(map(str,[self.segment_tree[i] for i in range(self.le,self.le+self.N)]))+"]"N=int(input())X=list(map(int,input().split()))Q=int(input())query0=[(X[i],-1,i) for i in range(N)]query1=[(-X[i],-1,i) for i in range(N)]for q in range(Q):l,r,x=map(int,input().split())l-=1query0.append((x,l,r,q))query1.append((-x,l,r,q))inf=1<<30ans_lst=[inf]*Qquery0.sort()query1.sort()for query in (query0,query1):ST=Segment_Tree(N,max,-inf,bisect_search=False)for tpl in query:if len(tpl)==3:x,_,i=tplST[i]=xelse:x,l,r,q=tplans_lst[q]=min(ans_lst[q],x-ST.Fold(l,r))print(*ans_lst,sep="\n")