N,W=map(int,input().split()) w,v=[],[] for _ in range(N): hw,hv=map(int,input().split()) w.append(hw) v.append(hv) #ふつうにdpするとdp[i][j]=i番目までみて重さがj以下の価値の最大値、がわかるので、すべての重さに対して価値の最大値がわかっていると言える。 #Vが確実に選ばれるのはW-xの最大の価値+V>Wの最大の価値がなりたつとき? dp=[[0]*(W+1) for _ in range(N+1)] for i in range(1,N+1): for j in range(1,W+1): if j-w[i-1]>=0: dp[i][j]=max(dp[i-1][j-w[i-1]]+v[i-1],dp[i-1][j]) else: dp[i][j]=dp[i-1][j] for x in range(1,W+1): print(dp[N][W]-dp[N][W-x]+1)