#include #include #include #include using namespace std; typedef long long LL; typedef pair PII; const int N = 300010; int n, lidx[N], ridx[N]; LL a[N], ans; priority_queue, greater> pq; struct BIT { int tr[N]; void Add(int idx, int val) { for (; idx <= n; idx += idx & -idx) tr[idx] += val; } int Sum(int idx) { int res = 0; for (; idx > 0; idx -= idx & -idx) res += tr[idx]; return res; } int Query(int l, int r) { if (l > r) return 0; return Sum(r) - Sum(l - 1); } }; BIT bit; void Solve() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); for (int i = 1; i <= n; ++i) { LL l, r; scanf("%lld%lld", &l, &r); LL left = a[i] - l, right = a[i] + r; lidx[i] = lower_bound(a + 1, a + n + 1, left) - a; ridx[i] = upper_bound(a + 1, a + n + 1, right) - a - 1; } ans = 0LL; for (int i = 1; i <= n; ++i) { while (!pq.empty() && pq.top().first < i) { int idx = pq.top().second; pq.pop(); bit.Add(idx, -1); } int l = lidx[i]; if (l <= i - 1) ans += bit.Query(l, i - 1); bit.Add(i, 1); pq.push(PII(ridx[i], i)); } printf("%lld\n", ans); } int main() { Solve(); return 0; }