#include <bits/stdc++.h>
using namespace std;
template <typename Monoid>
struct SegmentTree {
  typedef function<Monoid(Monoid, Monoid)> F;
  int n;
  F f;
  Monoid id;
  vector<Monoid> dat;
  SegmentTree(int n_, F f, Monoid id) : f(f), id(id) { init(n_); }
  void init(int n_) {
    n = 1;
    while (n < n_) n <<= 1;
    dat.assign(n << 1, id);
  }
  void build(const vector<Monoid> &v) {
    for (int i = 0; i < v.size(); ++i) dat[i + n] = v[i];
    for (int i = n - 1; i; --i) dat[i] = f(dat[i << 1 | 0], dat[i << 1 | 1]);
  }
  void update(int k, Monoid x) {
    dat[k += n] = x;
    while (k >>= 1) dat[k] = f(dat[k << 1 | 0], dat[k << 1 | 1]);
  }
  Monoid query(int a, int b) {
    if (a >= b) return id;
    Monoid vl = id, vr = id;
    for (int l = a + n, r = b + n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) vl = f(vl, dat[l++]);
      if (r & 1) vr = f(dat[--r], vr);
    }
    return f(vl, vr);
  }
  Monoid operator[](int i) { return dat[i + n]; }
};
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<long long> x(n), v(n);
  for (int i = 0; i < n; ++i) cin >> x[i];
  for (int i = 0; i < n; ++i) cin >> v[i];
  vector<long long> compress(n);
  for (int i = 0; i < n; ++i) compress[i] = v[i];
  sort(compress.begin(), compress.end());
  compress.erase(unique(compress.begin(), compress.end()), compress.end());
  for (int i = 0; i < n; ++i)
    v[i] =
        lower_bound(compress.begin(), compress.end(), v[i]) - compress.begin();
  int m = compress.size();
  auto f = [](pair<long long, long long> a, pair<long long, long long> b) {
    return pair<long long, long long>{a.first + b.first, a.second + b.second};
  };
  SegmentTree<pair<long long, long long> > seg(m, f, {0, 0});
  vector<pair<long long, long long> > xv;
  for (int i = 0; i < n; ++i) xv.emplace_back(x[i], v[i]);
  sort(xv.begin(), xv.end());
  for (int i = 0; i < n; ++i) {
    auto p = seg[xv[i].second];
    seg.update(xv[i].second, {p.first + xv[i].first, p.second + 1});
  }
  long long ans = 0;
  for (int i = 0; i < n; ++i) {
    auto p = seg.query(xv[i].second, m), q = seg[xv[i].second];
    ans += p.first - xv[i].first * p.second;
    seg.update(xv[i].second, {q.first - xv[i].first, q.second - 1});
  }
  cout << ans << '\n';
}

### Prompt

Please formulate a Cpp solution to the following problem:

There are n points on a coordinate axis OX. The i-th point is located at the integer point x_i and has a speed v_i. It is guaranteed that no two points occupy the same coordinate. All n points move with the constant speed, the coordinate of the i-th point at the moment t (t can be non-integer) is calculated as x_i + t ⋅ v_i.

Consider two points i and j. Let d(i, j) be the minimum possible distance between these two points over any possible moments of time (even non-integer). It means that if two points i and j coincide at some moment, the value d(i, j) will be 0.

Your task is to calculate the value ∑_{1 ≤ i < j ≤ n} d(i, j) (the sum of minimum distances over all pairs of points).

Input

The first line of the input contains one integer n (2 ≤ n ≤ 2 ⋅ 10^5) — the number of points.

The second line of the input contains n integers x_1, x_2, ..., x_n (1 ≤ x_i ≤ 10^8), where x_i is the initial coordinate of the i-th point. It is guaranteed that all x_i are distinct.

The third line of the input contains n integers v_1, v_2, ..., v_n (-10^8 ≤ v_i ≤ 10^8), where v_i is the speed of the i-th point.

Output

Print one integer — the value ∑_{1 ≤ i < j ≤ n} d(i, j) (the sum of minimum distances over all pairs of points).

Examples

Input


3
1 3 2
-100 2 3


Output


3


Input


5
2 1 4 3 5
2 2 2 3 4


Output


19


Input


2
2 1
-3 0


Output


0

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
template <typename Monoid>
struct SegmentTree {
  typedef function<Monoid(Monoid, Monoid)> F;
  int n;
  F f;
  Monoid id;
  vector<Monoid> dat;
  SegmentTree(int n_, F f, Monoid id) : f(f), id(id) { init(n_); }
  void init(int n_) {
    n = 1;
    while (n < n_) n <<= 1;
    dat.assign(n << 1, id);
  }
  void build(const vector<Monoid> &v) {
    for (int i = 0; i < v.size(); ++i) dat[i + n] = v[i];
    for (int i = n - 1; i; --i) dat[i] = f(dat[i << 1 | 0], dat[i << 1 | 1]);
  }
  void update(int k, Monoid x) {
    dat[k += n] = x;
    while (k >>= 1) dat[k] = f(dat[k << 1 | 0], dat[k << 1 | 1]);
  }
  Monoid query(int a, int b) {
    if (a >= b) return id;
    Monoid vl = id, vr = id;
    for (int l = a + n, r = b + n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) vl = f(vl, dat[l++]);
      if (r & 1) vr = f(dat[--r], vr);
    }
    return f(vl, vr);
  }
  Monoid operator[](int i) { return dat[i + n]; }
};
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<long long> x(n), v(n);
  for (int i = 0; i < n; ++i) cin >> x[i];
  for (int i = 0; i < n; ++i) cin >> v[i];
  vector<long long> compress(n);
  for (int i = 0; i < n; ++i) compress[i] = v[i];
  sort(compress.begin(), compress.end());
  compress.erase(unique(compress.begin(), compress.end()), compress.end());
  for (int i = 0; i < n; ++i)
    v[i] =
        lower_bound(compress.begin(), compress.end(), v[i]) - compress.begin();
  int m = compress.size();
  auto f = [](pair<long long, long long> a, pair<long long, long long> b) {
    return pair<long long, long long>{a.first + b.first, a.second + b.second};
  };
  SegmentTree<pair<long long, long long> > seg(m, f, {0, 0});
  vector<pair<long long, long long> > xv;
  for (int i = 0; i < n; ++i) xv.emplace_back(x[i], v[i]);
  sort(xv.begin(), xv.end());
  for (int i = 0; i < n; ++i) {
    auto p = seg[xv[i].second];
    seg.update(xv[i].second, {p.first + xv[i].first, p.second + 1});
  }
  long long ans = 0;
  for (int i = 0; i < n; ++i) {
    auto p = seg.query(xv[i].second, m), q = seg[xv[i].second];
    ans += p.first - xv[i].first * p.second;
    seg.update(xv[i].second, {q.first - xv[i].first, q.second - 1});
  }
  cout << ans << '\n';
}

```