#include <bits/stdc++.h>   using namespace std;   struct data {     int x, h, p;   } a[100005];   int n, x[100005], kq[100005], st[4 * 100005];   void update(int id, int l, int r, int p, int v) {     if (l > p || r < p) return;     if (l == p && l == r) {       st[id] = v;       return;     }     int m = (l + r) >> 1;     update(id << 1, l, m, p, v);     update((id << 1) + 1, m + 1, r, p, v);     st[id] = max(st[id << 1], st[(id << 1) + 1]);   }   int getmax(int id, int l, int r, int d, int c) {     if (l > c || r < d) return 0;     if (l >= d && r <= c) return st[id];     int m = (l + r) >> 1;     return max(getmax((id << 1), l, m, d, c),                getmax((id << 1) + 1, m + 1, r, d, c));   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n;     for (int i = 1; i <= n; ++i) {       cin >> a[i].x >> a[i].h;       a[i].p = i;       a[i].h = a[i].x + a[i].h - 1;     }     sort(a + 1, a + n + 1, [](data a, data b) { return a.x < b.x; });     for (int i = n; i >= 1; --i) {       x[i] = a[i].x;       int pos = upper_bound(x + i + 1, x + n + 1, a[i].h) - x - 1;       int t = getmax(1, 1, n, i + 1, pos);       if (t < i) t = i;       kq[a[i].p] = t - i + 1;       update(1, 1, n, i, t);     }     for (int i = 1; i <= n; ++i) cout << kq[i] <<    ;     return 0;   }   