#include <bits/stdc++.h>
using namespace std;

struct Pst {
  int cnt;
  Pst *lc, *rc;
  Pst() : cnt(0), lc(nullptr), rc(nullptr) {}
  Pst(const Pst &oth) : cnt(oth.cnt), lc(oth.lc), rc(oth.rc) {}
  static Pst* modify(Pst *t, int lb, int rb, int k, int v) {
    Pst *n = new Pst(*t);
    if (rb - lb == 1) return n->cnt += v, n;
    int mb = lb + rb >> 1;
    if (k < mb) n->lc = modify(t->lc, lb, mb, k, v);
    else n->rc = modify(t->rc, mb, rb, k, v);
    n->cnt = n->lc->cnt + n->rc->cnt;
    return n;
  }
  static Pst* build(int lb, int rb) {
    Pst *t = new Pst;
    if (rb - lb == 1) return t;
    int mb = lb + rb >> 1;
    t->lc = build(lb, mb);
    t->rc = build(mb, rb);
    return t;
  }
};

signed main() {
  ios::sync_with_stdio(false);

  int N;
  cin >> N;

  vector<int> A(N);
  for (int i = 0; i < N; ++i) cin >> A[i];

  vector<int> L(N), R(N);
  for (int i = 0; i < N; ++i) cin >> L[i] >> R[i];

  vector<int> d(N);
  for (int i = 0; i < N; ++i) d[i] = A[i] + R[i];
  sort(d.begin(), d.end());
  d.erase(unique(d.begin(), d.end()), d.end());
  map<int, int> mp;
  for (int i = 0; i < d.size(); ++i) mp[d[i]] = i;

  vector<Pst *> sts(N + 1);
  sts[0] = Pst::build(0, d.size());
  for (int i = 0; i < N; ++i) sts[i + 1] = Pst::modify(sts[i], 0, d.size(), mp[A[i] + R[i]], 1);

  long long ans = 0;
  for (int i = 1; i < N; ++i) {
    int ver_lb = lower_bound(A.begin(), A.end(), A[i] - L[i]) - A.begin();
    int key_lb = lower_bound(d.begin(), d.end(), A[i]) - d.begin();
    function<int(Pst *, Pst *, int, int, int, int)> dfs =
        [&](Pst *vl, Pst *vr, int lb, int rb, int ql, int qr) {
          if (qr <= lb || rb <= ql) return 0;
          if (ql <= lb && rb <= qr) return vr->cnt - vl->cnt;
          int mb = lb + rb >> 1;
          return dfs(vl->lc, vr->lc, lb, mb, ql, qr) + dfs(vl->rc, vr->rc, mb, rb, ql, qr);
        };
    ans += dfs(sts[ver_lb], sts[i], 0, d.size(), key_lb, d.size());
  }

  cout << ans << endl;

  return 0;
}