
def bitadd(a,w,bit): #aにwを加える(1-origin)
 
    x = a
    while x <= (len(bit)-1):
        bit[x] += w
        x += x & (-1 * x)
 
def bitsum(a,bit): #ind 1～aまでの和を求める
 
    ret = 0
    x = a
    while x > 0:
        ret += bit[x]
        x -= x & (-1 * x)
    return ret


#区間更新BIT(BITを2つ用意し、BITの長さをN+2で初期化しておくべし)
def bitaddR(l,r,w,bit1,bit2): #半開区間[l,r)にwを加える

    bitadd(l,-1*w*l,bit1)
    bitadd(r,w*r,bit1)
    bitadd(l,w,bit2)
    bitadd(r,-1*w,bit2)

def bitsumR(r,bit1,bit2): #半開区間[1,r)の区間和

    return bitsum(r,bit1) + r * bitsum(r,bit2)


N,M = map(int,input().split())

bitA = [0] * (M+2)
bitB = [0] * (M+2)

len_LR = []

for i in range(N):

    l,r = map(int,input().split())
    len_LR.append([r-l,l,r])

len_LR.sort()
len_LR.append([float("inf"),0,float("inf")])
ind = 0
ns = N
ans = []

for d in range(M):

    d += 1

    while len_LR[ind][2]-len_LR[ind][1]+1 < d:

        bitaddR(len_LR[ind][1] , len_LR[ind][2]+1 , 1 ,bitA,bitB)
        ns -= 1
        ind += 1

    np = 0

    for i in range(d,M+1,d):
        np += bitsumR(i+1,bitA,bitB) - bitsumR(i,bitA,bitB)

    ans.append(ns + np)

print ("\n".join(map(str,ans)))
