#include <bits/stdc++.h>
using namespace std;
struct Domino {
  int x, h, id, qtd;
};
Domino a[100010];
int dp[100010];
int tree[4 * 100010];
bool comp(Domino d1, Domino d2) { return d1.x < d2.x; }
int bb(int ini, int fim, int x) {
  int ans = ini - 1;
  while (ini <= fim) {
    int meio = (ini + fim) / 2;
    if (a[meio].x <= x) {
      ans = meio;
      ini = meio + 1;
    } else
      fim = meio - 1;
  }
  return ans;
}
void update(int node, int ini, int fim, int id) {
  if (ini > fim) return;
  if (ini == fim)
    tree[node] = dp[id];
  else {
    int esq = 2 * node;
    int dir = esq + 1;
    int meio = (ini + fim) / 2;
    if (id <= meio)
      update(esq, ini, meio, id);
    else
      update(dir, meio + 1, fim, id);
    tree[node] = max(tree[esq], tree[dir]);
  }
}
int query(int node, int ini, int fim, int l, int r) {
  if (l > r) return 0;
  if (r < ini || l > fim) return 0;
  if (ini >= l && fim <= r) return tree[node];
  int esq = 2 * node;
  int dir = esq + 1;
  int meio = (ini + fim) / 2;
  return max(query(esq, ini, meio, l, r), query(dir, meio + 1, fim, l, r));
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].x >> a[i].h;
    a[i].id = i;
    a[i].qtd = 0;
  }
  sort(a + 1, a + n + 1, comp);
  dp[n] = n;
  a[n].qtd = 1;
  update(1, 1, n, n);
  for (int i = n - 1; i >= 1; i--) {
    int j = bb(i + 1, n, a[i].x + a[i].h - 1);
    dp[i] = max(i, query(1, 1, n, i + 1, j));
    a[i].qtd = dp[i] - i + 1;
    update(1, 1, n, i);
  }
  int ans[100010];
  for (int i = 1; i <= n; i++) ans[a[i].id] = a[i].qtd;
  for (int i = 1; i < n; i++) cout << ans[i] << " ";
  cout << ans[n] << endl;
  return 0;
}
