Problem:
Score : 700 points

Problem Statement

Snuke has decided to play a game, where the player runs a railway company.
There are M+1 stations on Snuke Line, numbered 0 through M.
A train on Snuke Line stops at station 0 and every d-th station thereafter, where d is a predetermined constant for each train.
For example, if d = 3, the train stops at station 0, 3, 6, 9, and so forth.

There are N kinds of souvenirs sold in areas around Snuke Line. The i-th kind of souvenirs can be purchased when the train stops at one of the following stations: stations l_i, l_i+1, l_i+2, ..., r_i.

There are M values of d, the interval between two stops, for trains on Snuke Line: 1, 2, 3, ..., M.
For each of these M values, find the number of the kinds of souvenirs that can be purchased if one takes a train with that value of d at station 0.
Here, assume that it is not allowed to change trains.

Constraints

1 ≦ N ≦ 3 × 10^{5}

1 ≦ M ≦ 10^{5}

1 ≦ l_i ≦ r_i ≦ M

Input

The input is given from Standard Input in the following format:

N M
l_1 r_1
:
l_{N} r_{N}

Output

Print the answer in M lines. The i-th line should contain the maximum number of the kinds of souvenirs that can be purchased if one takes a train stopping every i-th station.

Sample Input 1

3 3
1 2
2 3
3 3

Sample Output 1

3
2
2

If one takes a train stopping every station, three kinds of souvenirs can be purchased: kind 1, 2 and 3.

If one takes a train stopping every second station, two kinds of souvenirs can be purchased: kind 1 and 2.

If one takes a train stopping every third station, two kinds of souvenirs can be purchased: kind 2 and 3.

Sample Input 2

7 9
1 7
5 9
5 7
5 9
1 1
6 8
3 4

Sample Output 2

7
6
6
5
4
5
5
3
2

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

int ri() {
	int n;
	scanf("%d", &n);
	return n;
}
struct SegTree {
	int n;
	std::vector<int> data;
	SegTree (int n_) {
		for (n = 1; n < n_; n <<= 1);
		data.resize(n << 1);
	}
	void add(int i, int val) {
		for (i += n; i; i >>= 1) data[i] += val;
	}
	int sum(int l, int r) {
		int res = 0;
		for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
			if (r & 1) res += data[--r];
			if (l & 1) res += data[l++];
		}
		return res;
	}
};
struct Points2D {
	std::vector<std::pair<int, int> > pts;
	struct Query {
		int x1;
		int x2;
		int y1;
		int y2;
		int *res;
	};
	std::vector<Query> queries;
	void add(std::pair<int, int> pt) {
		pts.push_back(pt);
	}
	void query(Query query) {
		queries.push_back(query);
	}
	void calculate() {
		int sz = queries.size();
		for (int i = 0; i < sz; i++) {
			*queries[i].res = 0;
			queries.push_back({queries[i].x1, queries[i].x2, queries[i].y2, 1, queries[i].res});
			queries[i].y2 = -1;
		}
		std::sort(pts.begin(), pts.end(), [] (auto &a, auto &b) { return a.second < b.second; });
		std::sort(queries.begin(), queries.end(), [] (Query &a, Query &b) { return a.y1 < b.y1; });
		int n = pts.size();
		int head = 0;
		SegTree tree(300001);
		for (auto &i : queries) {
			while (head < n && pts[head].second < i.y1) tree.add(pts[head++].first, 1);
			*i.res += i.y2 * tree.sum(i.x1, i.x2);
		}
	}
};

int main() {
	int n = ri(), m = ri();
	int l[n], r[n];
	Points2D points;
	for (int i = 0; i < n; i++) l[i] = ri(), r[i] = ri(), points.add({l[i], r[i]});
	std::vector<int> res(m, 0);
	for (int i = 1; i <= m; i++)
		for (int j = 0; j < m; j += i) points.query({j + 1, std::min(m + 1, j + i), j + 1, std::min(m + 1, j + i), &res[i - 1]});
	points.calculate();
	for (int i = 1; i <= m; i++) std::cout << n - res[i - 1] << std::endl;
	return 0;
}