### BUGGY CODE ###

import sys
import bisect
input = sys.stdin.readline

class SegmentTree:
    def __init__(self, a):
        self.padding = -float('inf')
        self.n = len(a)
        self.N = 2 ** (self.n-1).bit_length()
        self.data = [self.padding]*(self.N-1) + a + [self.padding]*(self.N-self.n)
        for i in range(2*self.N-2, 0, -2):
            self.data[(i-1)//2] = max([self.data[i], self.data[i-1]])
    
    def __len__(self):
        return self.n
    
    def update(self, i, x):
        idx = self.N - 1 + i
        self.data[idx] = x
        while idx:
            idx = (idx-1) // 2
            self.data[idx] = max([self.data[2*idx+1], self.data[2*idx+2]])
    
    def query(self, i, j):
        # [i, j)
        if i == j:
            return self.data[self.N - 1 + i]
        else:
            idx1 = self.N - 1 + i
            idx2 = self.N - 2 + j # 閉区間にする
            result = self.padding
            while idx1 + 1 < idx2:
                if idx1&1 == 0: # idx1が偶数
                    result = max([result, self.data[idx1]])
                if idx2&1 == 1: # idx2が奇数
                    result = max([result, self.data[idx2]])
                    idx2 -= 1
                
                idx1 //= 2
                idx2 = (idx2 - 1)//2
            
            if idx1 == idx2:
                result = max([result, self.data[idx1]])
            else: # idx1 + 1 == idx2
                result = max([result, self.data[idx1], self.data[idx2]])
            
            return result


MOD = 998244353
N = int(input())
XD = [list(map(int, input().split())) for i in range(N)]
XD.sort()

X = [xd[0] for xd in XD]
D = [xd[1] for xd in XD]

dp = [0]*N + [1]
touch_range = [i for i in range(N)]
st = SegmentTree(touch_range)
for i in range(N-1, -1, -1):
  right = X[i] + D[i]
  idx = bisect.bisect_left(X, right)
  r = st.query(i, idx)
  st.update(i, r)
  dp[i] = (dp[i+1] + dp[r+1]) % MOD


print(dp[0])

### FIXED CODE ###

import sys
import bisect
input = sys.stdin.readline

class SegmentTree:
    def __init__(self, a):
        self.padding = -float('inf')
        self.n = len(a)
        self.N = 2 ** (self.n-1).bit_length()
        self.data = [self.padding]*(self.N-1) + a + [self.padding]*(self.N-self.n)
        for i in range(2*self.N-2, 0, -2):
            self.data[(i-1)//2] = max(self.data[i], self.data[i-1])
    
    def __len__(self):
        return self.n
    
    def update(self, i, x):
        idx = self.N - 1 + i
        self.data[idx] = x
        while idx:
            idx = (idx-1) // 2
            self.data[idx] = max(self.data[2*idx+1], self.data[2*idx+2])
    
    def query(self, i, j):
        # [i, j)
        if i == j:
            return self.data[self.N - 1 + i]
        else:
            idx1 = self.N - 1 + i
            idx2 = self.N - 2 + j # 閉区間にする
            result = self.padding
            while idx1 + 1 < idx2:
                if idx1&1 == 0: # idx1が偶数
                    result = max(result, self.data[idx1])
                if idx2&1 == 1: # idx2が奇数
                    result = max(result, self.data[idx2])
                    idx2 -= 1
                
                idx1 //= 2
                idx2 = (idx2 - 1)//2
            
            if idx1 == idx2:
                result = max(result, self.data[idx1])
            else: # idx1 + 1 == idx2
                result = max(result, self.data[idx1], self.data[idx2])
            
            return result


MOD = 998244353
N = int(input())
XD = [list(map(int, input().split())) for i in range(N)]
XD.sort()

X = [xd[0] for xd in XD]

dp = [0] * (N+1)
dp[-1] = 1
st = SegmentTree([i for i in range(N)])
for i in range(N-1, -1, -1):
  idx = bisect.bisect_left(X, sum(XD[i])) - 1
  if idx > i:
    idx = st.query(i, idx+1)
    st.update(i, idx) 
  dp[i] = (dp[i+1] + dp[idx+1]) % MOD

print(dp[0])