#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath>
#include <climits>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <list>
#include <bitset>
#include <vector>
using namespace std;

#define I64d_OJ

//#ifdef I64d_OJ
//#define LL __int64
//#endif // I64d_OJ
#ifdef I64d_OJ
#define LL long long
#endif // I64d_OJ

typedef unsigned LL ULL;
typedef unsigned uint;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
typedef pair<LL,LL> pLL;
typedef vector<int> vi;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-f; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
#define MID(a,b) (((LL)(a)+(LL)(b))>>1)
#define absx(a) ((a)<0?-(a):(a))
#define MK(a,b) make_pair(a,b)
#define PB(a) push_back(a)
#define lowbit(x) ((x)&-(x))

#define lc c[x][0]
#define rc c[x][1]

template< typename T >
inline void Max(T &a,T &b){if(a<b) a=b;}
template< typename T>
inline void Min(T &a,T &b){if(a>b) a=b;}

const double pi=(double)acos(-1.0);
const double eps=(double)1e-8;
const int INF = (int) 0x3f3f3f3f;
const int MOD = (int) 998244353;
const int MAXN =(int) 2e5+10;
const int MAXM = (int) 3e6+10;

///--------------------START-------------------------
int N;
int X[MAXN],D[MAXN];
int xx[MAXN<<1],xxcnt;
int mx[MAXN<<3];
int Rmax[MAXN];
//LL dp[MAXN<<2],add[MAXN<<2];
LL ans;
LL dp[MAXN];
vector<int> maxR[MAXN];

struct Node{
    int l,r;
}node[MAXN];

bool cmp(const Node& a,const Node& b){
    if(a.l==b.l) return a.r<b.r;
    return a.l<b.l;
}

int __ul,__ur;
LL __uw;
void update(int l,int r,int rt){
    if(l==r){
        mx[rt]=__uw;
        return;
    }
    int mid=(l+r)>>1;
    if(__ul<=mid) update(lson);
    else update(rson);
    mx[rt]=max(mx[ls],mx[rs]);
}

int __ql,__qr;
int query(int l,int r,int rt){
    if(__ql<=l&&r<=__qr){
        return mx[rt];
    }
    int mid=(l+r)>>1;
    if(__qr<=mid) return query(lson);
    else if(__ql>mid) return query(rson);
    else return max(query(lson),query(rson));
}
//
//void pushDown(int rt){
//    add[ls]=(add[ls]+add[rt])%MOD;
//    add[rs]=(add[rs]+add[rt])%MOD;
//    dp[ls]=(dp[ls]+add[rt])%MOD;
//    dp[rs]=(dp[rs]+add[rt])%MOD;
//    add[rt]=0;
//}
//
//LL updateDp(int l,int r,int rt){
//    if(__ul<=l&&r<=__ur){
//        dp[rt]=(dp[rt]+__uw)%MOD;
//        add[rt]=(add[rt]+__uw)%MOD;
//        return dp[rt];
//    }
//    pushDown(rt);
//    int mid=(l+r)>>1;
//    if(__ur<=mid) updateDp(lson);
//    else if(__ul>mid) updateDp(rson);
//    else{
//        updateDp(lson);
//        updateDp(rson);
//    }
//}

//void calAns(int l,int r,int rt){
//    if(l==r){
//        ans+=dp[rt];
//        printf("end %d: %lld\n",l,dp[rt]);
//        return;
//    }
//    pushDown(rt);
//    int mid=(l+r)>>1;
//    calAns(lson);
//    calAns(rson);
//}

void work(){
    scanf("%d",&N);
    for(int i=1;i<=N;i++){
        scanf("%d%d",&X[i],&D[i]);
        node[i].l=X[i];
        node[i].r=X[i]+D[i]-1;
        xx[++xxcnt]=node[i].l;
        xx[++xxcnt]=node[i].r;
    }
    sort(node+1,node+1+N,cmp);
    sort(xx+1,xx+1+xxcnt);
//    for(int i=1;i<=N;i++) printf("%d: %d %d\n",i,node[i].l,node[i].r);
    int tmpcnt=xxcnt;
    xxcnt=1;
    for(int i=2;i<=tmpcnt;i++){
        if(xx[i]!=xx[i-1]) xx[++xxcnt]=xx[i];
    }
    __ul=__ur=lower_bound(xx+1,xx+1+xxcnt,node[N].l)-xx;
    Rmax[N]=N;
    __uw=N;
    update(1,xxcnt,1);
    for(int i=N-1;i>=1;i--){
        __ql=lower_bound(xx+1,xx+1+xxcnt,node[i].l)-xx;
        __qr=lower_bound(xx+1,xx+1+xxcnt,node[i].r)-xx;
        int mx=query(1,xxcnt,1);
        Rmax[i]=max(i,Rmax[mx]);
        __ul=__ur=lower_bound(xx+1,xx+1+xxcnt,node[i].l)-xx;
        __uw=Rmax[i];
        maxR[Rmax[i]].push_back(i);
        update(1,xxcnt,1);
    }
//    for(int i=1;i<=N;i++) printf("%d ",Rmax[i]);
//    printf("\n");
    dp[N+1]=1;
    for(int i=N;i>=1;i--){
        dp[i]=(dp[i+1]+dp[Rmax[i]+1])%MOD;
        ans+=dp[i];
    }
    printf("%lld\n",dp[1]%MOD);
}

///--------------------END-------------------------
int main(){
#ifdef NNever
//freopen("data.in","r",stdin);
///freopen("out.txt","w",stdout);
#endif // NNever
    work();
    return 0;
}








Measured memory_bytes: 21504