#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1e4;
int n, ans, b[N * 2], mx[N * 8];
map<int, int> q;
struct nod {
  int x, l, r;
} a[N];
int Max(int x, int y) { return x > y ? x : y; }
bool cmp(nod aa, nod bb) { return aa.x < bb.x; }
int rd() {
  int s = 0, ff = 1;
  char w = getchar();
  while (w < '0' || w > '9') {
    if (w == '-') ff = -1;
    w = getchar();
  }
  while (w >= '0' && w <= '9') {
    s = s * 10 + (w - '0');
    w = getchar();
  }
  return s * ff;
}
int Query(int x, int l, int r, int L, int R) {
  if (L <= l && r <= R) return mx[x];
  int mid = (l + r) >> 1;
  int maxn = 0;
  if (L <= mid) maxn = Max(maxn, Query(x << 1, l, mid, L, R));
  if (R >= mid + 1) maxn = Max(maxn, Query(x << 1 | 1, mid + 1, r, L, R));
  return maxn;
}
void Add(int x, int l, int r, int w, int s) {
  mx[x] = Max(mx[x], s);
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (w <= mid)
    Add(x << 1, l, mid, w, s);
  else
    Add(x << 1 | 1, mid + 1, r, w, s);
}
int main() {
  n = rd();
  int ct = 0, cnt = 0;
  for (int i = 1; i <= n; i++) {
    int x = rd(), w = rd();
    a[i].x = x;
    a[i].l = x - w;
    a[i].r = x + w;
    b[++ct] = a[i].l;
    b[++ct] = a[i].r;
  }
  sort(b + 1, b + 1 + ct);
  sort(a + 1, a + 1 + n, cmp);
  for (int i = 1; i <= ct; i++) {
    if (i == 1 || b[i] != b[i - 1]) cnt++;
    q[b[i]] = cnt;
  }
  for (int i = 1; i <= n; i++) {
    int x = Query(1, 1, cnt, 1, q[a[i].l]);
    Add(1, 1, cnt, q[a[i].r], x + 1);
    ans = Max(ans, x + 1);
  }
  printf("%d\n", ans);
  return 0;
}
