#include <bits/stdc++.h>
using namespace std;
struct treap {
  int l, r, max, d, x, y;
};
int n, m, j, i, h, g, l, k, q1, q2, q, x, der, ans;
treap t[200500];
pair<int, int> p[200500];
void update(int q) {
  t[q].max = t[q].d;
  t[q].max = max(t[q].max, t[t[q].l].max);
  t[q].max = max(t[q].max, t[t[q].r].max);
}
pair<int, int> split(int q, int x) {
  if (!q) {
    return pair<int, int>(0, 0);
  }
  pair<int, int> p;
  if (t[q].x <= x) {
    p = split(t[q].r, x);
    t[q].r = p.first;
    p.first = q;
  } else {
    p = split(t[q].l, x);
    t[q].l = p.second;
    p.second = q;
  }
  update(q);
  return p;
}
int merge(int q1, int q2) {
  if (!q1 || !q2) {
    return max(q1, q2);
  }
  if (t[q1].y < t[q2].y) {
    t[q1].r = merge(t[q1].r, q2);
    update(q1);
    return q1;
  } else {
    t[q2].l = merge(q1, t[q2].l);
    update(q2);
    return q2;
  }
}
int get_max(int q, int x) {
  if (!q) {
    return 0;
  }
  if (t[q].x >= x) {
    int res = max(t[t[q].r].max, t[q].d);
    return max(res, get_max(t[q].l, x));
  } else {
    return get_max(t[q].r, x);
  }
}
void add(int num) {
  pair<int, int> p = split(der, t[num].x);
  der = merge(merge(p.first, num), p.second);
}
void solve() {
  scanf("%d", &n);
  for (j = 1; j <= n; j++) {
    scanf("%d%d", &p[j].first, &p[j].second);
  }
  sort(p + 1, p + n + 1);
  for (j = n; j >= 1; j--) {
    t[j].max = t[j].d = 1 + get_max(der, p[j].first + p[j].second);
    t[j].x = p[j].first - p[j].second;
    t[j].y = rand();
    add(j);
    ans = max(t[j].d, ans);
  }
  printf("%d\n", ans);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  srand(333);
  solve();
  return 0;
}
