Recommendations

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 \le n \le 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 \le a_i \le 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 \le t_i \le 10^5)$.

Output

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

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.

Solution:

#include <bits/stdc++.h>

using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
    cin >> a[i];
}
vector<int> t(n);
for (int i = 0; i < n; i++) {
    cin >> t[i];
}
a.push_back((int) 1.01e9);
t.push_back(0);
++n;
vector<int> order(n);
iota(order.begin(), order.end(), 0);
sort(order.begin(), order.end(), [&](int i, int j) {
return a[i] < a[j];
  });
  unsigned long long ans = 0;
  int last = 0;
  multiset<int> s;
long long sum = 0;
for (int i : order) {
while (a[i] > last && !s.empty()) {
++last;
auto it = prev(s.end());
sum -= *it;
s.erase(it);
ans += sum;
}
last = a[i];
s.insert(t[i]);
sum += t[i];
}
cout << ans << '\n';
  return 0;
}