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
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;

vector < pair <int,int> > V;
vector <int> graf[1000000];

int l=0;
bool odw[1000010];
int stos[1000010];
int byl[1000000];
int skladowa[1000000];

void dfs(int q)
{
    odw[q]=1;
    
    for (int j=0; j<graf[q].size(); j++)
        if (odw[graf[q][j]]==0)
            dfs(graf[q][j]);      
    stos[l]=q;
    l++;
}

int ile=0;
void ndfs(int q,int x)
{
	ile++;
	odw[q]=x;
//	cout<<q<<" "<<x<<" "<<odw[4]<<" "<<odw[5]<<endl;
    for (int j=0; j<graf[q].size(); j++)
        if (odw[graf[q][j]]<x)
        	ndfs(graf[q][j],x);
}

void sklad(int q,int nr)
{
	skladowa[q]=nr;
	for (int j=0; j<graf[q].size(); j++)
	{
		if (skladowa[graf[q][j]]==0)
			sklad(graf[q][j],nr);
		else
			nr=skladowa[graf[q][j]];
	}
	skladowa[q]=nr;
	
}


int main()
{
	int n,a,b;
	scanf("%d", &n);
	for (int i=0; i<n; i++)
	{
		scanf("%d%d", &a,&b);
		V.push_back(make_pair(a,b));
	}
	
	for (int i=0; i<n; i++)
	{
		for (int j=i+1; j<n; j++)
			if (V[i].first+V[i].second>=V[j].first)
				graf[i].push_back(j);
			
		for (int j=i-1; j>=0; j--)
			if (V[i].first-V[i].second<=V[j].first)
				graf[i].push_back(j);
	}
	
	int numer=1;
	for (int i=0; i<n; i++)
	{
		if (skladowa[i]==0)
			sklad(i,numer);
		if (skladowa[i]==numer)
			numer++;
	}
	
	for (int i=0; i<n; i++)
	{
	
        if (odw[i]==0)
        	dfs(i);
	}
	
	for (int i=0; i<n; i++)
		odw[i]=0;
		
	long long wyn=0LL;
	long long general=1;
	int u=0;
    for (int i=0; i<l; i++)
    {
    	ile=0;
    	int kand=stos[i];
    	if (i>0 && skladowa[stos[i]]!=skladowa[stos[i-1]])
    	{
    		//cout<<wyn<<"\n";
    		general*=(wyn+1LL);
    		wyn%=1000000007;
    		wyn=0LL;
    		u=0;
    	}
    	
    	ndfs(kand,u+1);
    	//cout<<"TU";
    	int Y=((u+1)-ile+1);
    	if (Y<=0)
    		continue;
    	else
    		wyn+=(long long)(Y);
    	u++;
    }
	
	printf("%lld\n",general+1);
	
	return 0;
}