#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 2e5 + 5;
struct segment {
int x, y, i;
};
// có một số kiểu truyền tham số:
// - truyền bằng tham trị: pass by value (int x): tốn thêm bộ nhớ để tạo ra bản sao của x
// - truyền bằng tham chiếu: pass by reference (int& x): dùng bản gốc
// - hằng tham chiếu (const int& x): dùng bản gốc, không được phép thay đổi giá trị của x
bool cmp_y(const segment& a, const segment& b) {
if (a.y == b.y) {
return (a.x > b.x);
}
return (a.y < b.y);
}
bool cmp_x(const segment& a, const segment& b) {
if (a.x == b.x) {
return (a.y > b.y);
}
return (a.x < b.x);
}
int n;
segment a[N], b[N];
int ft[N];
void init() {
for (int i = 1; i <= n; i++) ft[i] = 0;
}
void update(int i, int val) {
for (; i > 0; i -= i & (-i)) ft[i] += val;
}
int get(int i) {
int ans = 0;
for (; i <= n; i += i & (-i)) ans += ft[i];
return ans;
}
int ans[N];
// Mỗi đoạn thẳng [x[i], y[i]] chứa bao nhiêu đoạn thẳng [x[j], y[j]]
void sub1() {
// y(j) <= y(i), x(j) >= x(i)
// sort tăng dần theo y, cùng y thì giảm dần theo x
sort(a + 1, a + n + 1, cmp_y);
// nén x
vector<int> vals;
for (int i = 1; i <= n; i++) vals.push_back(a[i].x);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
// đếm
init();
for (int i = 1; i <= n; i++) {
// x(j) >= x(i)
// giá trị nén của x(i)
int val_x = lower_bound(vals.begin(), vals.end(), a[i].x) - vals.begin() + 1;
ans[a[i].i] = get(val_x);
update(val_x, 1);
}
for (int i = 1; i <= n; i++) cout << ans[i] << ' '; cout << '\n';
}
// Mỗi đoạn thẳng [x[i], y[i]] bị bao nhiêu đoạn thẳng [x[j], y[j]] chứa
void sub2() {
// x(j) <= x(i), y(j) >= y(i)
// sort tăng dần theo x, cùng x thì giảm dần theo y
sort(a + 1, a + n + 1, cmp_x);
// nén y
vector<int> vals;
for (int i = 1; i <= n; i++) vals.push_back(a[i].y);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
// đếm
init();
for (int i = 1; i <= n; i++) {
// y(j) >= y(i)
// giá trị nén của y(i)
int val_y = lower_bound(vals.begin(), vals.end(), a[i].y) - vals.begin() + 1;
ans[a[i].i] = get(val_y);
update(val_y, 1);
}
for (int i = 1; i <= n; i++) cout << ans[i] << ' '; cout << '\n';
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y;
a[i].i = i;
}
sub1();
sub2();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDJlNSArIDU7IAoKc3RydWN0IHNlZ21lbnQgewoJaW50IHgsIHksIGk7IAoJCn07IAoKLy8gY8OzIG3hu5l0IHPhu5Ega2nhu4N1IHRydXnhu4FuIHRoYW0gc+G7kTogCi8vIC0gdHJ1eeG7gW4gYuG6sW5nIHRoYW0gdHLhu4s6IHBhc3MgYnkgdmFsdWUgKGludCB4KTogdOG7kW4gdGjDqm0gYuG7mSBuaOG7myDEkeG7gyB04bqhbyByYSBi4bqjbiBzYW8gY+G7p2EgeCAKLy8gLSB0cnV54buBbiBi4bqxbmcgdGhhbSBjaGnhur91OiBwYXNzIGJ5IHJlZmVyZW5jZSAoaW50JiB4KTogZMO5bmcgYuG6o24gZ+G7kWMgCi8vIC0gaOG6sW5nIHRoYW0gY2hp4bq/dSAoY29uc3QgaW50JiB4KTogZMO5bmcgYuG6o24gZ+G7kWMsIGtow7RuZyDEkcaw4bujYyBwaMOpcCB0aGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIHgKCmJvb2wgY21wX3koY29uc3Qgc2VnbWVudCYgYSwgY29uc3Qgc2VnbWVudCYgYikgewoJaWYgKGEueSA9PSBiLnkpIHsKCQlyZXR1cm4gKGEueCA+IGIueCk7IAoJfQoJcmV0dXJuIChhLnkgPCBiLnkpOyAKfQoKYm9vbCBjbXBfeChjb25zdCBzZWdtZW50JiBhLCBjb25zdCBzZWdtZW50JiBiKSB7CglpZiAoYS54ID09IGIueCkgewoJCXJldHVybiAoYS55ID4gYi55KTsgCgl9CglyZXR1cm4gKGEueCA8IGIueCk7IAp9CgppbnQgbjsgIApzZWdtZW50IGFbTl0sIGJbTl07IAppbnQgZnRbTl07IAoKdm9pZCBpbml0KCkgewoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBmdFtpXSA9IDA7ICAKfQoKdm9pZCB1cGRhdGUoaW50IGksIGludCB2YWwpIHsKCWZvciAoOyBpID4gMDsgaSAtPSBpICYgKC1pKSkgZnRbaV0gKz0gdmFsOyAKfQoKaW50IGdldChpbnQgaSkgewoJaW50IGFucyA9IDA7ICAKCWZvciAoOyBpIDw9IG47IGkgKz0gaSAmICgtaSkpIGFucyArPSBmdFtpXTsKCXJldHVybiBhbnM7IAp9CgppbnQgYW5zW05dOyAKCi8vIE3hu5dpIMSRb+G6oW4gdGjhurNuZyBbeFtpXSwgeVtpXV0gY2jhu6lhIGJhbyBuaGnDqnUgxJFv4bqhbiB0aOG6s25nIFt4W2pdLCB5W2pdXQp2b2lkIHN1YjEoKSB7CgkvLyB5KGopIDw9IHkoaSksIHgoaikgPj0geChpKQoJLy8gc29ydCB0xINuZyBk4bqnbiB0aGVvIHksIGPDuW5nIHkgdGjDrCBnaeG6o20gZOG6p24gdGhlbyB4IAoJc29ydChhICsgMSwgYSArIG4gKyAxLCBjbXBfeSk7IAoKCS8vIG7DqW4geAoJdmVjdG9yPGludD4gdmFsczsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB2YWxzLnB1c2hfYmFjayhhW2ldLngpOyAKCXNvcnQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKTsgCgl2YWxzLnJlc2l6ZSh1bmlxdWUodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKSAtIHZhbHMuYmVnaW4oKSk7IAoKIAkvLyDEkeG6v20KIAlpbml0KCk7CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJLy8geChqKSA+PSB4KGkpCgkJLy8gZ2nDoSB0cuG7iyBuw6luIGPhu6dhIHgoaSkKCQlpbnQgdmFsX3ggPSBsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIGFbaV0ueCkgLSB2YWxzLmJlZ2luKCkgKyAxOwoJCWFuc1thW2ldLmldID0gZ2V0KHZhbF94KTsgICAKCQl1cGRhdGUodmFsX3gsIDEpOyAKCX0KCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNvdXQgPDwgYW5zW2ldIDw8ICcgJzsgY291dCA8PCAnXG4nOyAKfQoKLy8gTeG7l2kgxJFv4bqhbiB0aOG6s25nIFt4W2ldLCB5W2ldXSBi4buLIGJhbyBuaGnDqnUgxJFv4bqhbiB0aOG6s25nIFt4W2pdLCB5W2pdXSBjaOG7qWEKdm9pZCBzdWIyKCkgewoJLy8geChqKSA8PSB4KGkpLCB5KGopID49IHkoaSkKCS8vIHNvcnQgdMSDbmcgZOG6p24gdGhlbyB4LCBjw7luZyB4IHRow6wgZ2nhuqNtIGThuqduIHRoZW8geSAKCXNvcnQoYSArIDEsIGEgKyBuICsgMSwgY21wX3gpOyAKCgkvLyBuw6luIHkgCgl2ZWN0b3I8aW50PiB2YWxzOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHZhbHMucHVzaF9iYWNrKGFbaV0ueSk7IAoJc29ydCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpOyAKCXZhbHMucmVzaXplKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpIC0gdmFscy5iZWdpbigpKTsgCgoJLy8gxJHhur9tCglpbml0KCk7ICAKCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQkvLyB5KGopID49IHkoaSkKCQkvLyBnacOhIHRy4buLIG7DqW4gY+G7p2EgeShpKQoJCWludCB2YWxfeSA9IGxvd2VyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgYVtpXS55KSAtIHZhbHMuYmVnaW4oKSArIDE7CgkJYW5zW2FbaV0uaV0gPSBnZXQodmFsX3kpOyAgIAoJCXVwZGF0ZSh2YWxfeSwgMSk7IAoJfQoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY291dCA8PCBhbnNbaV0gPDwgJyAnOyBjb3V0IDw8ICdcbic7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyAgCQoJY2luID4+IG47IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY2luID4+IGFbaV0ueCA+PiBhW2ldLnk7CgkJYVtpXS5pID0gaTsgIAoJfQoKCXN1YjEoKTsKCXN1YjIoKTsgCn0=