#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

struct Node { 
    int val = 0;
    Node* c[2];
    
    Node* copy() {
        Node* x = new Node(); *x = *this;
        return x;
    }
    
    int query(int low, int high, int L, int R) {  
        if (low <= L && R <= high) return val;
        if (R < low || high < L) return 0;
        int M = (L+R)/2;
        return c[0]->query(low,high,L,M)+c[1]->query(low,high,M+1,R);
    }
    
    Node* upd(int ind, int v, int L, int R) {
        if (R < ind || ind < L) return this;
        Node* x = copy();
        
        if (ind <= L && R <= ind) {
            x->val += v;
            return x;
        }
        
        int M = (L+R)/2;
        x->c[0] = x->c[0]->upd(ind,v,L,M);
        x->c[1] = x->c[1]->upd(ind,v,M+1,R);
        x->val = x->c[0]->val+x->c[1]->val;
        
        return x;
    }
    
    void build(vi& arr, int L, int R) {
        if (L == R) {
            if (L < (int)arr.size()) val = arr[L];
            else val = 0;
            return;
        }
        int M = (L+R)/2;
        c[0] = new Node();
        c[0]->build(arr,L,M);
        c[1] = new Node();
        c[1]->build(arr,M+1,R);
        val = c[0]->val+c[1]->val;
    }
};

template<int SZ> struct pers {
    Node* loc[SZ+1]; // stores location of root after ith update
    
    pers() { }
    
    int query(int ti, int low, int high) { 
        return loc[ti]->query(low,high,0,SZ-1);
    }
};

pers<1<<17> p;

int N,M;
vi todo[MX];

void solve(int x) {
    int ans = 0;
    for (int i = x; i <= M; i += x) {
        ans += p.query(i-x+1,0,i);
        //cout << "AH " << i-x+1 << " " << i << " " << p.query(i-x+1,0,i) << "\n";
    }
    cout << ans << "\n";
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> N >> M;
    F0R(i,N) {
        int a,b; cin >> a >> b;
        todo[a].pb(b);
    }
    vi emp;
    p.loc[M+1] = new Node();
    p.loc[M+1]->build(emp,0,(1<<17)-1);
    FORd(i,1,M+1) {
        p.loc[i] = p.loc[i+1];
        for (int j: todo[i]) {
            //cout << "HI " << i << " " << j << "\n";
            p.loc[i] = p.loc[i]->upd(i,1,0,(1<<17)-1);
            p.loc[i] = p.loc[i]->upd(j+1,-1,0,(1<<17)-1);
        }
    }
    
    FOR(i,1,M+1) solve(i);
}

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?) ARRAY OUT OF BOUNDSS