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>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
void read(int& x){ scanf("%d",&x); }
template<typename T,typename... Args>
void read(T& a,Args&... b){ read(a); read(b...); }
#define all(x) (x).begin(),(x).end()
#define pb push_back

struct NMT {
	static const int M=131072;
	vector<int> tree[M<<1];
	void put_point(int x, int y){
		x += M;
		while(x) tree[x].pb(y), x>>=1;
	}
	void build(){ for(auto& v:tree) sort(all(v)); }
	
	int vcnt(vector<int>& v, int d, int u){
		return upper_bound(all(v), u) - lower_bound(all(v), d);
	}
	int rcnt(int l, int r, int d, int u){
		l+=M; r+=M;
		int ret=0;
		while(l<=r){
			if(l%2==1) ret+=vcnt(tree[l++], d, u);
			if(r%2==0) ret+=vcnt(tree[r--], d, u);
			l>>=1; r>>=1;
		}
		return ret;
	}
} s2;

int n, m;

int main()
{
    read(n, m);
    for(int i=1; i<=n; ++i){
		int x, y; read(x, y);
		s2.put_point(x, y);
    }
    s2.build();
    for(int d=1; d<=m; ++d){
		int cx = 0;
		int ret = n;
		while(true){
			if(cx + d > m) break;
			ret -= s2.rcnt(cx+1, m, 1, cx+d-1);
			cx += d;
		}
		ret -= s2.rcnt(cx+1, m, 1, m);
		printf("%d\n", ret);
    }
    return 0;
}