static const int SIZE = 100005;
static const int TREESIZE = SIZE<<2;
int arr[SIZE];
int segTree[TREESIZE];inline int lChild(int r) { return r<<1; }
inline int rChild(int r) { return r<<1|1; }void pushDown(int rt)
{segTree[lChild(rt)] += segTree[rt];segTree[rChild(rt)] += segTree[rt];
}void build(int l, int r, int rt)
{int mid = l + ((r-l)>>1); segTree[rt] = 0; if(l == r) return; build(l, mid, lChild(rt)); build(mid+1, r, rChild(rt));
}void update(const int L, const int R, int l, int r, int rt)
{if (L <= l && r <= R){segTree[rt]++;return ;}int m = l + ((r-l)>>1);//注意怎樣準確截取區間if (R <= m) update(L, R, l, m, lChild(rt));else if (L > m) update(L, R, m+1, r, rChild(rt));else{update(L, m, l, m, lChild(rt));update(m+1, R, m+1, r, rChild(rt));//須要截取準確區間}
}void query(int l, int r, int rt)
{if (l == r){arr[l] = segTree[rt];return;}pushDown(rt);int m = l + ((r-l)>>1);query(l, m, lChild(rt));query(m+1, r, rChild(rt));
}int main()
{int n, a, b;while (scanf("%d", &n) && n != 0){fill(arr, arr+n+1, 0);build(1, n, 1);for(int i = 0; i < n; i++) { scanf("%d %d",&a,&b); update(a, b, 1, n, 1);} query(1, n, 1);for(int i = 1; i < n; i++) { printf("%d ", arr[i]); } printf("%d\n",arr[n]); }return 0;
}