#include using namespace std; #define ALL(x) x.begin(),x.end() #define rep(i,n) for(int i=0;i<(n);i++) #define debug(v) cout<<#v<<":";for(auto x:v){cout<bool chmax(T &a,const T &b){if(abool chmin(T &a,const T &b){if(b ostream &operator<<(ostream &os,const pair&p){ os< ostream &operator<<(ostream &os,const vector&v){ for(int i=0;i<(int)v.size();i++) os< istream &operator>>(istream &is,pair&p){ is>>p.first>>p.second; return is; } template istream &operator>>(istream &is,vector&v){ for(T &x:v)is>>x; return is; } struct RangeTree{ // xの各値がyのソート済み配列を持つ vector>seg; vectorx; int sz; RangeTree(vector> a){ sz=1; while((int)a.size()>sz)sz<<=1; sort(begin(a),end(a)); if(a.size())x.push_back(a[0].first); for(auto &p:a)if(x.back()!=p.first)x.push_back(p.first); while((int)x.size()0;i--){ seg[i].resize(seg[2*i].size()+seg[2*i+1].size()); merge(begin(seg[2*i]),end(seg[2*i]),begin(seg[2*i+1]),end(seg[2*i+1]),begin(seg[i])); } } // [x1,x2),[y1,y2) int count(ll x1,ll y1,ll x2,ll y2){ int l=lower_bound(begin(x),end(x),x1)-begin(x),r=lower_bound(begin(x),end(x),x2)-begin(x); l+=sz,r+=sz; int ret=0; for(;l>=1,r>>=1){ if(l&1){ ret+=lower_bound(begin(seg[l]),end(seg[l]),y2)-lower_bound(begin(seg[l]),end(seg[l]),y1); l++; } if(r&1){ r--; ret+=lower_bound(begin(seg[r]),end(seg[r]),y2)-lower_bound(begin(seg[r]),end(seg[r]),y1); } } return ret; } }; signed main(){ int n;cin>>n; ll a[n],l[n],r[n]; rep(i,n) cin>>a[i]; rep(i,n) cin>>l[i]>>r[i]; vector> ps; rep(i,n) ps.push_back({i,a[i]+r[i]}); RangeTree seg(ps); ll ans=0; rep(i,n){ int idx=lower_bound(a,a+n,a[i]-l[i])-a; // [idx,i) // [a[i],INF) ans+=seg.count(idx,a[i],i,LINF); } cout<