Wa #1 #2 #12
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
using namespace std;
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline ll read(){
ll x=0,w=1;
char aa=getchar();
while(aa<'0'||aa>'9'){
if(aa=='-') w=-1;
aa=getchar();
}
while(aa>='0'&&aa<='9'){
x=(x<<3)+(x<<1)+aa-'0';
aa=getchar();
}
return x*w;
}
const int N=5e5+10;
const ll mod=1e9+7;
int n,nd,top,tot,su;
int id[N],dfn[N<<2],low[N<<2],st[N<<2],f[N<<2];
ll ans;
ll x[N],r[N],lf[N],rt[N];
bool vis[N];
struct node{
int l,r;
}d[N<<2];
vector<int> e[N<<2],v[N<<2];
void build(int p,int l,int r){
d[p]=(node){l,r};
nd=max(nd,p);
if(l==r){
id[l]=p;
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
e[p].push_back(ls(p));
e[p].push_back(rs(p));
}
void connect(int p,int l,int r,int ql,int qr,int num){
if(ql<=l&&r<=qr){
if(p==num) return;
e[num].push_back(p);
return;
}
int mid=(l+r)>>1;
if(mid>=ql) connect(ls(p),l,mid,ql,qr,num);
if(mid<qr) connect(rs(p),mid+1,r,ql,qr,num);
}
void tarjan(int x){
dfn[x]=low[x]=++tot;
st[++top]=x;
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y]) low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
int y=0;
su++;
while(y!=x){
y=st[top--];
f[y]=su,vis[y]=0;
lf[su]=min(lf[su],d[y].l);
rt[su]=max(rt[su],d[y].r);
if(y==x) break;
}
}
}
void dfs(int x){
vis[x]=1;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(!vis[y]) dfs(y);
lf[x]=min(lf[x],lf[y]);
rt[x]=max(rt[x],rt[y]);
}
}
int main(){
n=read();
for(int i=1;i<=n;i++) x[i]=read(),r[i]=read();
x[n+1]=2e18+10;
build(1,1,n);
for(int i=1;i<=n;i++){
if(!r[i]) continue;
int L=lower_bound(x+1,x+n+1,x[i]-r[i])-x;
int R=upper_bound(x+1,x+n+1,x[i]+r[i])-x-1;
connect(1,1,n,L,R,id[i]);
d[id[i]]=(node){L,R};
}
memset(lf,0x3f,sizeof(lf));
tarjan(1);
for(int x=1;x<=nd;x++){
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
if(f[x]!=f[y]) v[f[x]].push_back(f[y]);
}
}
for(int i=1;i<=su;i++){
sort(v[i].begin(),v[i].end());
unique(v[i].begin(),v[i].end());
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=su;i++){
if(!vis[i]) dfs(i);
}
for(ll i=1;i<=n;i++) ans=(ans+(rt[f[id[i]]]-lf[f[id[i]]]+1)*i)%mod;
printf("%lld\n",ans);
return 0;
}