#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")


#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
 
const int maxn = 100005;
 
inline int gi()
{
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	int sum = 0;
	while ('0' <= c && c <= '9') sum = sum * 10 + c - 48, c = getchar();
	return sum;
}
 
int n, m, sum[maxn];
 
struct node
{
	int Id, x, y1, y2;
 
	bool operator < (const node &a) const {
		return x != a.x ? x < a.x : !Id;
	}
} s[maxn * 65];
int cnt;
 
int Sum[maxn];
 
void insert(int x, int a)
{
	++x;
	while (x <= m + 1) {
		Sum[x] += a;
		x += x & (-x);
	}
}
 
int query(int x)
{
	int res = 0; ++x;
	while (x) {
		res += Sum[x];
		x -= x & (-x);
	}
	return res;
}
 
int main()
{
	n = gi(); m = gi();
	for (int i = 1; i <= n; ++i) s[++cnt] = (node) {0, gi(), 0, gi()};
	for (int i = 2, j; i <= m; ++i) {
		for (j = i; j <= m; j += i)
			s[++cnt] = (node) {-i, j - i, j - i + 1, j - 1}, s[++cnt] = (node) {i, j - 1, j - i + 1, j - 1};
		j -= i; if (j + 1 <= m) s[++cnt] = (node) {-i, j, j + 1, m}, s[++cnt] = (node) {i, m, j + 1, m};
	}

	sort(s + 1, s + cnt + 1);
	for (int i = 1; i <= cnt; ++i)
		if (!s[i].Id) insert(s[i].y2, 1);
		else {
			if (s[i].Id < 0) sum[-s[i].Id] -= query(s[i].y2) - query(s[i].y1 - 1);
			else sum[s[i].Id] += query(s[i].y2) - query(s[i].y1 - 1);
		}
	for (int i = 1; i <= m; ++i) printf("%d\n", n - sum[i]);
	
	return 0;
}
