class segtreemin: def __init__(self,n): self.size=1 while self.size1: x//=2 self.dat[x]=min(self.dat[2*x],self.dat[2*x+1]) def querry(self,u,v): u+=self.size v+=self.size score=10**10 while u1: x//=2 self.dat[x]=max(self.dat[2*x],self.dat[2*x+1]) def querry(self,u,v): u+=self.size v+=self.size score=0 while u1: x//=2 self.dat[x]=(self.dat[2*x]+self.dat[2*x+1]) def querry(self,u,v): u+=self.size v+=self.size score=0 while u=b: r=m else: l=m+1 if l==r: break c1=Zcount.querry(0,l) d1=Zsum.querry(0,l) c2=Zcount.querry(l+1,N+1) d2=Zsum.querry(l+1,N+1) result1=(c1*B[l]-d1)+((d2-k1)-(c2-1)*B[l]) l=0 r=N b=count//2+1 while True: m=(l+r)//2 c=Zcount.querry(0,m+1) if c>=b: r=m else: l=m+1 if l==r: break c1=Zcount.querry(0,l) d1=Zsum.querry(0,l) c2=Zcount.querry(l+1,N+1) d2=Zsum.querry(l+1,N+1) result2=((c1-1)*B[l]-(d1-k2))+(d2-c2*B[l]) result[x]=min(result1,result2) for y in G[x]: if used[y]==True: continue dist[y]=dist[x]+1 dfs(y) Zcount.update(R[A[x]],-1) Zsum.update(R[A[x]],-A[x]) T[A[x]]-=1 if T[A[x]]==0: Zmax.update(R[A[x]],0) Zmin.update(R[A[x]],10**10) dfs(0) for i in range(1,N+1): print(result[i])