import std.stdio, std.array, std.string, std.conv, std.algorithm;
import std.typecons, std.range, std.random, std.math, std.container;
import std.numeric, std.bigint, core.bitop, core.stdc.stdio, std.bitmanip;

void main() {
    int N, M;
    scanf("%d %d", &N, &M);
    int l, r;
    auto seg = new int[][](M+2);
    foreach (i; 0..N) {
        scanf("%d %d", &l, &r);
        seg[r-l+1] ~= l;
    }

    auto segsort = new SortedRange!(SortedRange!(int[], "a < b"), "a < b");
    foreach (i; 0..M+1)
        segsort[i] = seg[i].sort().assumeSorted();

    auto acm = new int[](M+1);
    acm[M] = seg[M].length.to!int;
    for (int i = M-1; i >= 0; i--) {
        acm[i] = acm[i+1] + seg[i].length.to!int;
    }

    foreach (i; 1..M+1) {
        int ans = acm[i];
        foreach (j; 1..i) {
            foreach (k; iota(i, M+1, i)) {
                auto lb = seg[j].length.to!int - segsort[j].lowerBound(k-j+1).length.to!int;
                auto ub = seg[j].length.to!int - segsort[j].lowerBound(k+1).length.to!int;
                ans += lb - ub;
                //writeln(i, " ", j, " ",k, " ", lb, " ", ub);
                //writeln(segsort[j].lowerBound(k));
            }
        }
        ans.writeln;
    }
}
