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
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second
#define _ ios_base::sync_with_stdio(0); cin.tie(0);
//mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());

using namespace std;

using ll = long long;
using pi = pair<int,int>;
using vi = vector<int>;

const int mod = 1e9 + 7, nax = 300*1000+10, INF = 1e9;
int n;
ll pos[nax], r[nax];
pi prz[nax];
int dp[nax], dp2[nax], R;

int T[(1 << 20)];

void upd(int a, int x) {
	a += R;
	T[a] = x;
	while(a > 1) {
		a/=2;
		T[a] = (T[2*a]+ T[2*a+1]) % mod;
	}
}

int qr(int a, int b) {
	if(a > b) return 0;
	a += R; b += R;
	int w = T[a];
	if(a != b) w = (w + T[b]) % mod;
	while(a/2!=b/2) {
		if(a%2==0) w = (w + T[a+1]) % mod;
		if(b%2==1) w = (w + T[b-1]) % mod;
		a/=2;
		b/=2;
	}
	return w;
}

vi active;
vector<pi>border;

int main() {_
	cin >> n;
	for(int i = 1; i <= n; ++i) {
		cin >> pos[i] >> r[i];
	}
	for(int i = 1; i <= n; ++i) {
		int low = i, high = n, mid;
		while(low <= high) {
			mid = (low + high) / 2;
			if(pos[mid] - pos[i] <= r[i]) {
				low = mid + 1;
			} else {
				high = mid - 1;
			}
		}
		int b = low - 1;
		low = 1; high = i;
		while(low <= high) {
			mid = (low + high)/2;
			if(pos[i] - pos[mid] <= r[i]) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		}
		int a = high + 1;
		prz[i] = {a, b};
	}
	R = 1;
	while(R <= n) R *= 2;
	dp[0] = dp2[0] = 1;
	int ans = 1;
	vector<pi>lft = {};
	for(int i = 1; i <= n; ++i) {
		while((int)border.size() > 0 && border.back().ND <= i) {
			border.pop_back();
		}
		if(prz[i].ND > i) {
			border.emplace_back(i, prz[i].ND);
		}
		int up_to = 0;
		if((int)border.size() > 0) {
			up_to = border.back().ST + 1;
		}
		while((int)lft.size() > 0 && lft.back().ST > prz[i].ST) {
			lft.pop_back();
		}
		int d = 1;
		if((int)lft.size()>0) d = lft.back().ND+1;
		lft.emplace_back(prz[i].ST, i);
		while((int)active.size() > 0 && active.back() >= d) {
			upd(active.back(), 0);
			active.pop_back();
		}
		if(d <= prz[i].ST) {
			upd(prz[i].ST, (prz[i].ST == 1 ? 1 : dp2[prz[i].ST - 2]));
			active.PB(prz[i].ST);
		}
		int w = qr(up_to, i);
		dp[i] = w;
		dp2[i] = (dp[i] + dp2[i - 1]) % mod;
		ans = (ans + dp[i]) % mod;
	}
	cout << ans;
}