#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <map>
#include <algorithm>
#include <string>
#include <utility>
#include <set>
#include <stack>
#include <deque>
#include <ctime>
#include <random>
#include <cassert>
#include <cmath>
#include <climits>
#include <queue>
#include <cstring>
#include <bitset>
#include <iomanip>
#include <chrono>

/*
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("popcnt")
#pragma GCC target("avx2")
*/


#ifdef LOCAL
	#define dbg(x) cout << #x << " : " << x << endl;
#else 
	#define dbg(x)
#endif

#define int long long
#define fi(a,b) for (int i=a;i<b;i++)
#define fj(a,b) for (int j=a;j<b;j++)
#define fk(a,b) for (int k=a;k<b;k++)
#define fi1(a,b) for (int i=a-1;i>=b;i--)
#define fj1(a,b) for (int j=a-1;j>=b;j--)
#define fk1(a,b) for (int k=a-1;k>=b;k--)
#define fx(x,a) for (auto& x : a)
#define rep(i, a, b) for (int i = a; i < b; ++i)
#define rep1(i, a, b) for (int i = a - 1; i >= b; --i)
#define siz(x) (int)x.size()
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

using namespace std;

template<typename T1, typename T2>inline void mine(T1 &x, T2 y) { if (x > y) x = y; }
template<typename T1, typename T2>inline void maxe(T1 &x, T2 y) { if (x < y) x = y; }

ostream& operator << (ostream &a, const vector<int> &b) {
    for (auto k : b) cout << k << ' ';
    return a;
}


typedef long long ll;
typedef unsigned long long ull;
typedef char ch;
typedef string str;
typedef pair<int, int> pii;
typedef map<int, int> mii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<ch> vch;
typedef vector<vch> vvch;
typedef vector<str> vs;



const int MOD = 998244353;
const int INF = 1000000050;
const long long BIG = (long long)2e18 + 50;
const int MX = 200010;
const double EPS = 1e-9;


mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

struct seg {
	int l;
	int r;
	seg(int a = 0, int b = 0) {
		l = a;
		r = b;
	}
	bool operator < (const seg & s) const {
		return l < s.l;
	}
};

seg segs[MX];

int solve(int l, int r) {
	if (r < l)
		return 1;
	int cur = 1;
	int ind = l + 1;
	while (ind <= r) {
		cur = cur * solve(ind, segs[ind - 1].r) % MOD;
		ind = segs[ind - 1].r + 1;
	}
	cur = (cur + 1) % MOD;
	return cur;
}

int BIT[MX];

void upd(int ind, int x) {
	for (int i = ind; i < MX; i += i&-i) 
		maxe(BIT[i], x); 
}

int get(int ind) {
	int res = ind;
	for (int i = ind; i > 0; i -= i&-i)
		maxe(res, BIT[i]);
	return res;
} 
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;
    cin >> n;
    ++n;
    vi nums;
    nums.push_back(-2 * INF);
    fi(0, n - 1) {
   		cin >> segs[i].l >> segs[i].r;
   		nums.push_back(segs[i].l);
    }
    nums.push_back(-INF);
    segs[n - 1] = {-INF, 2 * INF};

    sort(all(nums));
    fi(0, n) {
    	segs[i].r = lb(all(nums), segs[i].l + segs[i].r) - nums.begin() - 1;
    	segs[i].l = lb(all(nums), segs[i].l) - nums.begin();
    }
    sort(segs, segs + n);
    fi1(n, 0) {
    	segs[i].r = get(segs[i].r);
    	upd(segs[i].l, segs[i].r);
    	dbg(segs[i].r);
    }
    int res = solve(1, n) - 1;
    if (res < 0)
    	res += MOD;
    cout << res << '\n';
}

Measured memory_bytes: 15984