#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#define I inline
#define nnq nanachi
#define lson k<<1
#define rson k<<1|1
#define mid (l+r>>1)
#define int long long
#define mkp make_pair
using namespace std;
const int mod = 1000000007;
const int N = 4000010;
struct po {
int x,r;
int L,R;
}a[N],mk[N];
struct npo {
int L,R;
}b[N];
int n;
int lsh[N],val[N],id[N],low[N],dfn[N],col[N],vis[N],stack[N],rev[N*3],vtot,cnt,coc,scnt;
map<int,int> mp;
map<pair<int,int>,int> mp2;
vector<int> q[N],rq[N];
I void add(int x,int y) {
q[x].push_back(y);
}
void build1(int l,int r,int k) {
a[k].L=l; a[k].R=r;
if(l==r) {
id[l]=k;
return ;
}
build1(l,mid,lson);
build1(mid+1,r,rson);
add(k,lson); add(k,rson);
}
void trans(int l,int r,int nl,int nr,int num,int k) {
if(l>=nl&&r<=nr) {
if(k!=num) add(num,k);
return ;
}
if(nl<=mid) trans(l,mid,nl,nr,num,lson);
if(nr>mid) trans(mid+1,r,nl,nr,num,rson);
}
void dfs(int x) {
stack[++scnt]=x;
dfn[x]=low[x]=++cnt;
for(int i=0;i<q[x].size();++i) {
int to=q[x][i];
if(!dfn[to]) {
dfs(to);
low[x]=min(low[x],low[to]);
} else if(!col[to]) low[x]=min(low[x],dfn[to]);
}
if(dfn[x]==low[x]) {
col[x]=++coc;
b[coc].L=1e18+1; b[coc].R=-1e18-1;
b[coc].L=min(b[coc].L,a[x].L),b[coc].R=max(b[coc].R,a[x].R);
while(stack[scnt]!=x) {
int numb=stack[scnt];
col[stack[scnt--]]=coc;
b[coc].L=min(b[coc].L,a[numb].L),b[coc].R=max(b[coc].R,a[numb].R);
}
scnt--;
}
}
void dfs2(int x) {
vis[x]=1;
for(int i=0;i<rq[x].size();++i) {
int to=rq[x][i];
if(!vis[to]) dfs2(to);
b[x].L=min(b[x].L,b[to].L);
b[x].R=max(b[x].R,b[to].R);
}
}
I int read() {
int ret=0,w=1; char ch;
while((ch=getchar())>'9'||ch<'0'&&ch!='-'); if(ch=='-') w=-1; else ret=ch-'0';
while((ch=getchar())>='0'&&ch<='9') ret=ret*10+ch-'0';
return ret*w;
}
#undef mid
signed main()
{
n=read();
for(int i=1;i<=n;++i) a[i].x=read(),a[i].r=read(),lsh[i]=a[i].x; a[0].x=-1e18-1; a[n+1].x=1e18+1;
for(int i=1;i<=n;++i) if(a[i].x!=a[i-1].x) val[++vtot]=a[i].x,mp[a[i].x]=vtot;
build1(1,n,1);
for(int i=1;i<=n;++i) {
int l=1,r=n;
while(l<=r) {
int mid=l+r>>1;
if(a[mid].x>=a[i].x-a[i].r) a[id[i]].L=mid,r=mid-1;
else l=mid+1;
}
l=1; r=n;
while(l<=r) {
int mid=l+r>>1;
if(a[mid].x<=a[i].x+a[i].r) a[id[i]].R=mid,l=mid+1;
else r=mid-1;
}
trans(1,n,a[id[i]].L,a[id[i]].R,id[i],1);
}
dfs(1);
for(int i=1;i<=(n<<1|1);++i)
for(int j=0;j<q[i].size();++j) {
int to=q[i][j];
if(col[to]==col[i]) continue;
if(mp2.find(mkp(col[i],col[to]))!=mp2.end()) continue;
rq[col[i]].push_back(col[to]);
mp2[mkp(col[i],col[to])]=1;
}
for(int i=1;i<=coc;++i) if(!vis[i]) dfs2(i);
int ans=0;
for(int i=1;i<=n;++i) ans+=i*(b[col[id[i]]].R-b[col[id[i]]].L+1)%mod,ans=ans>=mod?ans-mod:ans;
cout<<ans<<endl;
return 0;
}
86 WA1,2