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.
import java.util.*;
import java.io.*;
import java.util.Map.*;

public class D_1315 {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int[] a = sc.nextIntArray(n), t = sc.nextIntArray(n);
		TreeMap<Integer, ArrayList<Integer>> map = new TreeMap<>();
		for(int i = 0; i < n; i++) {
			if(map.containsKey(a[i]))
				map.get(a[i]).add(t[i]);
			else {
				ArrayList<Integer> temp = new ArrayList<Integer>();
				temp.add(t[i]);
				map.put(a[i], temp);
			}
		}
		
		TreeMap<Integer, Integer> count = new TreeMap<>();
		long sum = 0, ans = 0;
		int cur = 0;
		while(true) {
			if(count.size() == 0 && map.isEmpty())
				break;
			if(count.size() == 0) {
				Entry<Integer, ArrayList<Integer>> e = map.pollFirstEntry();
				cur = e.getKey();
				ArrayList<Integer> temp = e.getValue();
				for(int x : temp) {
					sum += x;
					int c = count.getOrDefault(x, 0) + 1;
					count.put(x, c);
				}
				cur++;
				int x = count.lastKey();
				int c = count.getOrDefault(x, 1) - 1;
				if(c == 0)
					count.remove(x);
				else
					count.put(x, c);
				sum -= x;
				ans += sum;
			} else {
				if(!map.isEmpty() && cur == map.firstKey()) {
					Entry<Integer, ArrayList<Integer>> e = map.pollFirstEntry();
					ArrayList<Integer> temp = e.getValue();
					for(int x : temp) {
						sum += x;
						int c = count.getOrDefault(x, 0) + 1;
						count.put(x, c);
					}
					cur++;
					int x = count.lastKey();
					int c = count.getOrDefault(x, 1) - 1;
					if(c == 0)
						count.remove(x);
					else
						count.put(x, c);
					sum -= x;
					ans += sum;
				} else {
					cur++;
					int x = count.lastKey();
					int c = count.getOrDefault(x, 1) - 1;
					if(c == 0)
						count.remove(x);
					else
						count.put(x, c);
					sum -= x;
					ans += sum;
				}
			}
		}
		
		pw.println(ans);
		pw.flush();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream system) {
			br = new BufferedReader(new InputStreamReader(system));
		}

		public Scanner(String file) throws Exception {
			br = new BufferedReader(new FileReader(file));
		}

		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public String nextLine() throws IOException {
			return br.readLine();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public char nextChar() throws IOException {
			return next().charAt(0);
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			int[] array = new int[n];
			for (int i = 0; i < n; i++)
				array[i] = nextInt();
			return array;
		}

		public Integer[] nextIntegerArray(int n) throws IOException {
			Integer[] array = new Integer[n];
			for (int i = 0; i < n; i++)
				array[i] = new Integer(nextInt());
			return array;
		}

		public long[] nextLongArray(int n) throws IOException {
			long[] array = new long[n];
			for (int i = 0; i < n; i++)
				array[i] = nextLong();
			return array;
		}

		public double[] nextDoubleArray(int n) throws IOException {
			double[] array = new double[n];
			for (int i = 0; i < n; i++)
				array[i] = nextDouble();
			return array;
		}

		public static int[] shuffle(int[] a) {
			int n = a.length;
			Random rand = new Random();
			for (int i = 0; i < n; i++) {
				int tmpIdx = rand.nextInt(n);
				int tmp = a[i];
				a[i] = a[tmpIdx];
				a[tmpIdx] = tmp;
			}
			return a;
		}

		public boolean ready() throws IOException {
			return br.ready();
		}

		public void waitForInput() throws InterruptedException {
			Thread.sleep(3000);
		}
	}
}
