参考:http://blog.jobbole.com/96430/
// Cows
// http://poj.org/problem?id=2481
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
int maxe = -1;
struct Segment {
int s, e, id;
bool operator < (const Segment& r) const {
if (s < r.s) return true;
if (s > r.s) return false;
return e > r.e;
}
};
int N;
int arr[maxn];
Segment seg[maxn];
int ans[maxn];
inline int lowbit(int x) { return x & -x; }
void add(int *arr, int x, int v) {
for (int i = x; i <= maxe; i+=lowbit(i)) {
arr[i] += v;
}
}
int sum(int* arr, int x) {
int s = 0;
for (int i = x; i ; i-=lowbit(i)) {
s += arr[i];
}
return s;
}
int main() {
while (cin >> N) {
if (!N) break;
maxe = -1;
for (int i = 1; i <= N; i++) {
scanf("%d%d", &seg[i].s, &seg[i].e);
seg[i].id = i;
maxe = max(maxe, seg[i].e);
}
memset(arr, 0, (maxe+4)*sizeof(int));
sort(seg+1, seg+1+N);
int lasti = 1;
add(arr, seg[1].e, 1);
ans[seg[1].id] = 0;
for (int i = 2; i <= N; i++) {
if (seg[i].s == seg[lasti].s && seg[i].e == seg[lasti].e) {
ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1) - 1;
continue;
} else {
if (i-1 > lasti) {
add(arr, seg[lasti].e, i-1-lasti);
}
}
ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1);
add(arr, seg[i].e, 1);
lasti = i;
}
for (int i = 1; i <= N; i++) {
printf("%d ", ans[i]);
}
printf("\n");
}
return 0;
}