#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 = 1e5 + 5;
struct domino {
int x, h, pos;
bool operator<(const domino& other) const {
return (x < other.x);
}
};
int n;
domino a[N];
int seg[4 * N];
void update(int id, int l, int r, int pos, int val) {
if (l > pos || r < pos) return;
if (l == r) {
seg[id] = val;
return;
}
int mid = (l + r) >> 1;
update(id * 2, l, mid, pos, val);
update(id * 2 + 1, mid + 1, r, pos, val);
seg[id] = max(seg[id * 2], seg[id * 2 + 1]);
}
int getMax(int id, int l, int r, int u, int v) {
if (l > v || r < u) return -INF;
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return max(getMax(id * 2, l, mid, u, v), getMax(id * 2 + 1, mid + 1, r, u, v));
}
// Tìm i đầu tiên trong đoạn [l, r] sao cho a[i].x > x
int binSearch(domino a[], int l, int r, int x) {
int ans = r + 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (a[mid].x > x) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
return ans;
}
int dp[N]; // dp[i] = số domino sẽ bị đổ nếu ta đổ domino thứ i
int ans[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].h;
a[i].pos = i;
}
sort(a + 1, a + n + 1);
// dp[i] = max{(j - i) + dp[j]}
// <=> dp[i] = max{dp[j] + j} - i
for (int i = n; i >= 1; i--) {
dp[i] = 1;
// [l, r] là đoạn các domino có thể bị đổ trực tiếp bởi domino i
int l = binSearch(a, i + 1, n, a[i].x);
int r = binSearch(a, i + 1, n, a[i].x + a[i].h - 1) - 1;
if (l <= r) {
dp[i] = getMax(1, 1, n, l, r) - i;
}
update(1, 1, n, i, dp[i] + i);
}
for (int i = 1; i <= n; i++) ans[a[i].pos] = dp[i];
for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDFlNSArIDU7IAoKc3RydWN0IGRvbWlubyB7CglpbnQgeCwgaCwgcG9zOyAgCglib29sIG9wZXJhdG9yPChjb25zdCBkb21pbm8mIG90aGVyKSBjb25zdCB7CgkJcmV0dXJuICh4IDwgb3RoZXIueCk7Cgl9Cn07IAoKaW50IG47IApkb21pbm8gYVtOXTsgIAoKaW50IHNlZ1s0ICogTl07IAoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpIHsKCWlmIChsID4gcG9zIHx8IHIgPCBwb3MpIHJldHVybjsgCgoJaWYgKGwgPT0gcikgewoJCXNlZ1tpZF0gPSB2YWw7IAoJCXJldHVybjsgCgl9CgoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgl1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHBvcywgdmFsKTsgCgl1cGRhdGUoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgcG9zLCB2YWwpOyAKCglzZWdbaWRdID0gbWF4KHNlZ1tpZCAqIDJdLCBzZWdbaWQgKiAyICsgMV0pOyAKfQoKaW50IGdldE1heChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CglpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAtSU5GOyAgCgoJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHJldHVybiBzZWdbaWRdOyAKCglpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCXJldHVybiBtYXgoZ2V0TWF4KGlkICogMiwgbCwgbWlkLCB1LCB2KSwgZ2V0TWF4KGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYpKTsgCn0KCi8vIFTDrG0gaSDEkeG6p3UgdGnDqm4gdHJvbmcgxJFv4bqhbiBbbCwgcl0gc2FvIGNobyBhW2ldLnggPiB4CmludCBiaW5TZWFyY2goZG9taW5vIGFbXSwgaW50IGwsIGludCByLCBpbnQgeCkgewoJaW50IGFucyA9IHIgKyAxOyAgCgl3aGlsZSAobCA8PSByKSB7CgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgkJaWYgKGFbbWlkXS54ID4geCkgewoJCQlhbnMgPSBtaWQ7ICAgCgkJCXIgPSBtaWQgLSAxOyAKCQl9CgkJZWxzZSB7CgkJCWwgPSBtaWQgKyAxOyAKCQl9Cgl9CglyZXR1cm4gYW5zOyAKfQoKaW50IGRwW05dOyAvLyBkcFtpXSA9IHPhu5EgZG9taW5vIHPhur0gYuG7iyDEkeG7lSBu4bq/dSB0YSDEkeG7lSBkb21pbm8gdGjhu6kgaSAKaW50IGFuc1tOXTsgIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWNpbiA+PiBhW2ldLnggPj4gYVtpXS5oOyAgCgkJYVtpXS5wb3MgPSBpOyAgCgl9CgoJc29ydChhICsgMSwgYSArIG4gKyAxKTsgIAoKCS8vICAgICBkcFtpXSA9IG1heHsoaiAtIGkpICsgZHBbal19IAoJLy8gPD0+IGRwW2ldID0gbWF4e2RwW2pdICsgan0gLSBpICAKCglmb3IgKGludCBpID0gbjsgaSA+PSAxOyBpLS0pIHsKCQlkcFtpXSA9IDE7ICAgCgkJCgkJLy8gW2wsIHJdIGzDoCDEkW/huqFuIGPDoWMgZG9taW5vIGPDsyB0aOG7gyBi4buLIMSR4buVIHRy4buxYyB0aeG6v3AgYuG7n2kgZG9taW5vIGkKCQlpbnQgbCA9IGJpblNlYXJjaChhLCBpICsgMSwgbiwgYVtpXS54KTsgCgkJaW50IHIgPSBiaW5TZWFyY2goYSwgaSArIDEsIG4sIGFbaV0ueCArIGFbaV0uaCAtIDEpIC0gMTsgCgoJCWlmIChsIDw9IHIpIHsKCQkJZHBbaV0gPSBnZXRNYXgoMSwgMSwgbiwgbCwgcikgLSBpOyAKCQl9CgoJCXVwZGF0ZSgxLCAxLCBuLCBpLCBkcFtpXSArIGkpOyAKCX0KCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFuc1thW2ldLnBvc10gPSBkcFtpXTsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjb3V0IDw8IGFuc1tpXSA8PCAnICc7ICAKfQ==