1 1 13 2 1
#include <iostream> #include <stdio.h> #include<string.h> using namespace std; struct node { int l, r, mark; }a[500000]; int k, n; void set(int l,int r,int i) { a[i].l = l; a[i].r = r; a[i].mark = 0; if (l == r) { return; } int mid = (l + r) / 2; set(l, mid, i * 2); set(mid + 1, r, i * 2 + 1); } void move(int i) { a[2 * i].mark += a[i].mark; a[i * 2 + 1].mark += a[i].mark;//要向下加,直接覆盖会错 a[i].mark = 0; } void add(int l, int r, int i) { if (a[i].r == a[i].l) { a[i].mark += 1; return; } if (a[i].r == r&&a[i].l==l) { a[i].mark += 1; return; } if (a[i].mark)move(i);//下移 int mid = (a[i].r + a[i].l) / 2; if (mid >= r)add(l, r, i * 2); else if (mid < l)add(l, r, i * 2 + 1); else add(l, mid, i * 2), add(mid + 1, r, i * 2 + 1); } void find(int l, int r, int i) { if (a[i].r == a[i].l) { k++; cout <<a[i].mark; if (k != n) cout << " "; return; } if (a[i].mark)move(i); int mid = (a[i].r + a[i].l) / 2; if (mid >= r)find(l, r, i * 2); else if (mid < l)find(l, r, i * 2 + 1); else find(l, mid, i * 2), find(mid + 1, r, i * 2 + 1); } int main() { while (cin >> n, n) { set(1, n, 1); k = 0; for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; add(x, y, 1); } find(1, n, 1); cout << endl; } return 0; }