#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define is insert
#define MSK(k) (1ULL << k)
#define ton(k, vt) (k|((1ULL) << vt))
#define bat(k, vt) ((k >> vt) & 1)
#define elif else if
#define PROBLEM ""
using namespace std;
/*
/\_/\
(= ._.) ?
/ >0 \>1
*/
// #define and code:
const int maxN = 1e5;
int n;
struct node{
int h, k;
bool operator < (const node &o) const {
return h < o.h;
}
};
node store[maxN + 7];
struct tree{
int mi, idx;
};
tree seg[maxN * 4 + 7];
int lz[maxN * 4 + 7];
void push(int id){
if(!lz[id]){
return;
}
seg[id * 2].mi += lz[id];
seg[id * 2 + 1].mi += lz[id];
lz[id * 2] += lz[id];
lz[id * 2 + 1] += lz[id];
lz[id] = 0;
}
tree Merge(const tree &s1, const tree &s2){
tree tmp = {min(s1.mi, s2.mi)};
if(s1.mi <= s2.mi){
tmp.idx = s1.idx;
}
else{
tmp.idx = s2.idx;
}
return tmp;
}
void update(int id, int l, int r, int u, int v){
if(l > v || r < u){
return;
}
if(l >= u && r <= v){
seg[id].mi += 1;
lz[id] += 1;
return;
}
push(id);
int mid = (l + r) >> 1;
update(id * 2, l, mid, u, v);
update(id * 2 + 1, mid + 1, r, u, v);
seg[id] = Merge(seg[id * 2], seg[id * 2 + 1]);
}
tree get(int id, int l, int r, int u, int v){
if(l > v || r < u){
return {INT_MAX, 0};
}
if(l >= u && r <= v){
return seg[id];
}
push(id);
int mid = (l + r) >> 1;
tree tmp = Merge(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
seg[id] = Merge(seg[id * 2], seg[id * 2 + 1]);
return tmp;
}
void build(int id, int l, int r){
if(l == r){
seg[id] = {0, l};
return;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
seg[id] = Merge(seg[id * 2], seg[id * 2 + 1]);
}
int main() {
// freopen(PROBLEM".inp", "r", stdin);
// freopen(PROBLEM".out", "w", stdout);
// ios_base::sync_with_stdio(false);
// cin.tie(NULL);
// cout.tie(NULL);
cin >> n;
for(int i = 1; i <= n; i++){
int h, k;
cin >> h >> k;
store[i] = {h, k};
}
sort(store + 1, store + n + 1);
int m = store[n].h;
build(1, 1, m);
for(int i = 1; i <= n; i++){
int h = store[i].h;
int k = store[i].k;
// cout << "!!! " << h << " " << k << '\n';
while(k){
tree ans = get(1, 1, m, 1, h);
int val = ans.idx;
// cout << ans.mi << " " << ans.idx << '\n';
// cout << val << '\n';
int tmp = min(h - val + 1, k);
update(1, 1, m, val, val + tmp - 1);
// cout << val << " -> " << val + tmp - 1 << '\n';
k -= tmp;
h -= tmp;
}
}
ll res = 0;
for(int i = 1; i <= m; i++){
ll val = get(1, 1, m, i, i).mi;
// cout << val << " ";
res += val * (val - 1) / 2;
}
cout << res;
return 0;
}