VK news recommendation system daily selects interesting publications of one of n disjoint categories for each user. Each publication belongs to exactly one category. For each category i batch algorithm selects a_i publications.

The latest A/B test suggests that users are reading recommended publications more actively if each category has a different number of publications within daily recommendations. The targeted algorithm can find a single interesting publication of i-th category within t_i seconds. 

What is the minimum total time necessary to add publications to the result of batch algorithm execution, so all categories have a different number of publications? You can't remove publications recommended by the batch algorithm.

Input

The first line of input consists of single integer n — the number of news categories (1 ≤ n ≤ 200 000).

The second line of input consists of n integers a_i — the number of publications of i-th category selected by the batch algorithm (1 ≤ a_i ≤ 10^9).

The third line of input consists of n integers t_i — time it takes for targeted algorithm to find one new publication of category i (1 ≤ t_i ≤ 10^5).

Output

Print one integer — the minimal required time for the targeted algorithm to get rid of categories with the same size.

Examples

Input


5
3 7 9 7 8
5 2 5 7 5


Output


6


Input


5
1 2 3 4 5
1 1 1 1 1


Output


0

Note

In the first example, it is possible to find three publications of the second type, which will take 6 seconds.

In the second example, all news categories contain a different number of publications.
#include <bits/stdc++.h>
long long tree[262144 * 2 + 1];
std::pair<long long, long long> input[200010];
std::vector<long long> X;
void update(int num, long long val) {
  num |= 262144;
  tree[num] = val;
  while (num >>= 1) tree[num] = std::min(tree[num << 1], tree[num << 1 | 1]);
}
long long query(int s, int e) {
  s |= 262144, e |= 262144;
  long long r = LLONG_MAX / 2;
  while (s <= e) {
    if (s % 2 == 1) r = std::min(r, tree[s]);
    if (e % 2 == 0) r = std::min(r, tree[e]);
    s = (s + 1) >> 1;
    e = (e - 1) >> 1;
  }
  return r;
}
int main(void) {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", &input[i].first);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", &input[i].second);
  }
  std::sort(input + 1, input + 1 + n);
  long long number = input[1].first;
  for (int i = 1; i <= n; i++) {
    number = std::max(number, input[i].first);
    X.push_back(number);
    number++;
  }
  for (int i = 0; i < X.size(); i++) {
    update(i, i);
  }
  for (int i = 1; i <= n; i++) {
    input[i].first =
        std::lower_bound(X.begin(), X.end(), input[i].first) - X.begin();
  }
  std::sort(
      input + 1, input + 1 + n,
      [](std::pair<long long, long long> a, std::pair<long long, long long> b) {
        return a.second > b.second;
      });
  long long result = 0;
  for (int i = 1; i <= n; i++) {
    int index = query(input[i].first, X.size() - 1);
    result += (X[index] - X[input[i].first]) * input[i].second;
    update(index, LLONG_MAX / 2);
  }
  printf("%I64d\n", result);
}
