#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// وما نيل المطالب بالتمني ... ولكن تؤخذ الدنيا غلابا
struct SegTree {
#define LF (x * 2 + 1)
#define RT (x * 2 + 2)
#define md ((lx + rx) >> 1)
vector<int> seg;
int ign;
int sz;
SegTree(int n) {
sz = n;
ign = 0; // بندور على الماكسيموم، فالقيمة المبدئية 0
seg.assign(4 * n, 0);
}
int merge(const int &lf, const int &rt) {
return max(lf, rt);
}
// Point Update: بتعدل قيمة عنصر واحد بس
void update(int idx, int v, int x = 0, int lx = 0, int rx = -1) {
if (rx == -1) rx = sz - 1;
if (lx == rx) {
seg[x] = max(seg[x], v);
return;
}
if (idx <= md)
update(idx, v, LF, lx, md);
else
update(idx, v, RT, md + 1, rx);
seg[x] = merge(seg[LF], seg[RT]);
}
// Range Max Query
int query(int l, int r, int x = 0, int lx = 0, int rx = -1) {
if (rx == -1) rx = sz - 1;
if (l <= lx && rx <= r) return seg[x];
if (r < lx || rx < l) return ign;
return merge(
query(l, r, LF, lx, md),
query(l, r, RT, md + 1, rx)
);
}
#undef md
#undef LF
#undef RT
};
void solve() {
int n;
if (!(cin >> n)) return;
vector<int> l(n), r(n);
for (int i = 0; i < n; i++) {
cin >> l[i] >> r[i];
}
vector<int> dp(n, 0);
vector<vector<int>> delayed(n); // لتأجيل الإضافة في الشجرة
SegTree tree(n);
int ans = 0;
for (int i = 0; i < n; i++) {
// 1. تفعيل الزهور اللي فترة حظر اليمين بتاعتها خلصت عند الاندكس الحالي
for (int j : delayed[i]) {
tree.update(j, dp[j]);
}
// 2. حساب الـ DP للزهرة الحالية
int limit = i - l[i] - 1;
int mx = 0;
// لو في زهور متاحة قبل مسافة الحظر الشمال، نجيب الماكسيموم بتاعها
if (limit >= 0) {
mx = tree.query(0, limit);
}
dp[i] = mx + 1;
ans = max(ans, dp[i]);
// 3. تحديد ميعاد تفعيل الزهرة الحالية في المستقبل
int nxt = i + r[i] + 1;
if (nxt < n) {
delayed[nxt].push_back(i);
}
}
cout << ans << "\n";
}
int main() {
// تسريع الإدخال والإخراج عشان الـ Time Limit
ios_base::sync_with_stdio(false);
cin.tie(NULL);
solve();
return 0;
}