1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <bits/stdc++.h>
using namespace std;
int n;
struct M{
    long long x;
    long long r;
};

struct Z{
    long long x;
    long long y;
};

bool cmp(Z a, Z b) 
{
    if(a.y!=b.y) return a.y < b.y;
    return a.x > b.x;
}

M miny[300000];
Z zakres[300001];
long long DP[300001];
long long P = 1000000007ll;
void solve() {
    for(int i =0;i<n;i++){
        long long z_min = miny[i].x-miny[i].r;
        long long z_max = miny[i].x+miny[i].r;
        int j1 = i+1;
        int j2 = i-1;
        while(true){
            bool ok = false;
            if(z_max >= miny[j1].x && j1<n) {
                z_max = max(z_max, miny[j1].x+miny[j1].r);
                z_min = min(z_min, miny[j1].x-miny[j1].r);
                j1++;
                ok = true;
            }
            if(z_min <= miny[j2].x && j2>=0 ) {
                z_max = max(z_max, miny[j2].x+miny[j2].r);
                z_min = min(z_min, miny[j2].x-miny[j2].r);
                j2--;
                ok = true;
            }
            if(!ok)break;
        }
        zakres[i].x = j2+1 + 1;
        zakres[i].y = j1-1+ 1 ;
    }
    

    sort(zakres,zakres+n, cmp);
    //redukuj
    int j = 0;
    for(int i =1;i<n;i++){
        if(zakres[i].x != zakres[j].x  || zakres[i].y != zakres[j].y) {
            j++;
            zakres[j].x = zakres[i].x;
            zakres[j].y = zakres[i].y;
        }
    }
    int N = n;
    n = j+1;
    
  /*  for(int i =0;i<n;i++){
        cout<<zakres[i].x<<" - "<<zakres[i].y<<"\n";
    }*/
    DP[0] = 1;
    for(int i =0;i<n;i++) {
        DP[ zakres[i].y]++;
        for(int j = i-1;j>=0;j--){
            if(zakres[i].x  > zakres[j].x  && zakres[i].x <= zakres[j].y){
                DP[ zakres[i].y]++;
               // cout<<"+";
            }
        }
        for(int j = zakres[i].x-1;j>=1;j--){
           DP[ zakres[i].y]+=DP[j];
           DP[zakres[i].y]%=P;
       }
      // cout<<DP[ zakres[i].y]<<" ";
    }
    long long W = 0;
    for(int i =0;i<=zakres[n-1].y;i++) {
        W+=DP[i];
        W%=P;
    }
    cout<<W<<"\n";
};

int main() {
    cin>>n;
    for(int i =0;i<n;i++){
        cin>>miny[i].x>>miny[i].r;
    }   
    solve();
    return 0;
}