#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int MX = 100002;
int N, M;
struct BIT {
int tree[4*MX];
void init() {
memset(tree, 0, sizeof(tree));
}
void upd(int idx, int val, int l, int r, int n) {
if(idx < l || r < idx) return;
if(l == r) {
tree[n] += val;
return;
}
int m = (l + r)>>1;
upd(idx, val, l, m, 2*n);
upd(idx, val, m + 1, r, 2*n + 1);
tree[n] = tree[2*n] + tree[2*n + 1];
}
int quer(int a, int b, int l, int r, int n) {
if(b < l || r < a) return 0;
if(a <= l && r <= b) return tree[n];
int m = (l + r)>>1;
int L = quer(a, b, l, m, 2*n);
int R = quer(a, b, m + 1, r, 2*n + 1);
return L + R;
}
} bit, cnt;
vector<pii> seg[MX];
int main() {
scanf("%d %d", &N, &M);
cnt.init();
for(int i = 0; i < N; i++) {
int l, r; scanf("%d %d", &l, &r);
seg[ r - l + 1 ].push_back(pii(l, r));
cnt.upd(r - l + 1, 1, 0, MX - 1, 1);
}
for(int i = 1; i <= M; i++) {
int ans = cnt.quer(i, MX - 1, 0, MX - 1, 1);
int d = i;
while(d <= M) {
ans += bit.quer(0, d, 0, MX - 1, 1);
d += i;
}
printf("%d\n", ans);
for(int j = 0; j < seg[i].size(); j++) {
bit.upd(seg[i][j].first, 1, 0, MX - 1, 1);
bit.upd(seg[i][j].second + 1, -1, 0, MX - 1, 1);
}
}
}