import core.bitop, std.algorithm, std.ascii, std.bigint, std.conv,
    std.functional, std.math, std.numeric, std.range, std.stdio, std.string,
    std.random, std.typecons, std.container;

ulong MAX = 1_000_100, MOD = 1_000_000_007, INF = 1_000_000_000_000;
alias sread = () => readln.chomp();
alias lread(T = long) = () => readln.chomp.to!(T);
alias aryread(T = long) = () => readln.split.to!(T[]);
alias Pair = Tuple!(long, "begin", long, "end");
alias PQueue(T, alias less = "a<b") = BinaryHeap!(Array!T, less);

void main()
{
    auto n = lread();
    auto area = new Pair[](n);
    foreach (i; iota(n))
    {
        long x, l;
        scan(x, l);
        area[i] = Pair(x - l, x + l);
    }
    area.sort();
    // area.each!(x => x.writeln);
    long duplicate, iter = 1;
    auto dupary = new long[](n);
    foreach (i; iota(n - 1))
    {
        long tmp = iter;
        while(iter < n && area[i].end > area[iter].begin)
            iter++;
        // foreach (j; iota(iter - tmp))
        // {
        //     dupary[tmp + j]++;
        // }
        if(iter > tmp)
            duplicate++;
        iter += tmp;
    }
    // duplicate.writeln();
    // dupary.writeln();
    writeln(n - duplicate);
}

void scan(TList...)(ref TList Args)
{
    auto line = readln.split();
    foreach (i, T; TList)
    {
        T val = line[i].to!(T);
        Args[i] = val;
    }
}
