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]) result2=((c1-1)*B[l]-(d1-k2))+(d2-c2*B[l]) if B[l]!=k2: result[x]=min(result[x],result2) else: result[x]=min(result[x],result2+1) if B[l]!=k1: result[x]=min(result[x],result1) else: result[x]=min(result[x],result1+1) 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])