#include<bits/stdc++.h>
using namespace std;
vector<int> st;
int n;
void update(int l, int r, int i, int ch, int x){
if(l == r){
st[x] += ch;
return;
}
int mid = (l + r) / 2;
if(i <= mid) update(l, mid, i, ch, 2 * x + 1);
else update(mid + 1, r, i, ch, 2 * x + 2);
st[x] = st[2 * x + 1] + st[2 * x + 2];
}
int query(int lq, int rq, int l, int r, int x){
if(lq > r || l > rq) return 0;
if(lq <= l && r <= rq) return st[x];
int mid = (l + r) / 2;
return query(lq, rq, l, mid, 2 * x + 1) + query(lq, rq, mid + 1, r, 2 * x + 2);
}
void upd(int l, int r){
update(0, n, l, +1, 0);
if(r + 1 <= n) update(0, n, r + 1, -1, 0);
}
int searchfirst(int x){
int lo = -1, hi = n + 1, mid; //rossz, jo
while(lo + 1 < hi){
mid = (lo + hi) / 2;
if(query(0, mid, 0, n, 0) <= x) hi = mid;
else lo = mid;
}
return hi;
}
int searchlast(int x){
int lo = -1, hi = n + 1, mid; //rossz, jo
while(lo + 1 < hi){
mid = (lo + hi) / 2;
if(query(0, mid, 0, n, 0) < x) hi = mid;
else lo = mid;
}
return lo;
}
int main(){
cin >> n;
st.resize(4 * n + 4, 0);
vector<array<int, 2>> a(n);
for(int i = 0; i < n; i++) cin >> a[i][0] >> a[i][1];
sort(a.begin(), a.end());
for(auto [h, k] : a){
int x = query(0, h - k + 1, 0, n, 0);
int i = min(searchlast(x), h);
if(i != h) upd(i + 1, h); //ha van mas elotte
int j = max(searchfirst(x), 1);
int db = i - (h - k + 1) + 1;
upd(j, j + db - 1);
}
long long ans = 0;
for(int i = 0; i <= n; i++){
long long x = (long long)query(0, i, 0, n, 0);
ans += (x * (x - 1)) / 2;
}
cout << ans;
}