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


public class  Main{
	static class publ implements Comparable<publ>{
		int val,t,idx;
		publ(int v,int time,int i){
			val=v;
			t=time;
			idx=i;
		}
		@Override
		public int compareTo(publ o) {
			// TODO Auto-generated method stub
			return val-o.val;
		}
		
	}
	static class publ2 implements Comparable<publ2>{
		int val,t,idx;
		publ2(int v,int time,int i){
			val=v;
			t=time;
			idx=i;
		}
		@Override
		public int compareTo(publ2 o) {
			// TODO Auto-generated method stub
			return t-o.t;
		}
		
	}
	public static void main(String[] args) throws Exception{
		MScanner sc=new MScanner(System.in);
		PrintWriter pw=new PrintWriter(System.out);
		int n=sc.nextInt();
		int[]in=sc.takearr(n);
		int[]t=sc.takearr(n);
		publ[]arr=new publ[n];
		for(int i=0;i<n;i++) {
			arr[i]=new publ(in[i], t[i],i);
		}
		Arrays.sort(arr);
		PriorityQueue<publ2>pq=new PriorityQueue<publ2>(Collections.reverseOrder());
		int i=0;
		long ans=0;
		while(i<n) {
				long val=arr[i].val;
				while(i<n && arr[i].val==val) {
					pq.add(new publ2(arr[i].val, arr[i].t,arr[i].idx));
					i++;
				}
				
				long put=val;
				while((i==n || put<arr[i].val) && !pq.isEmpty()) {
					publ2 cur=pq.poll();
					//System.out.println(cur.val+" "+put+" "+cur.t);
					ans+=(put-cur.val)*1l*cur.t;
					put++;
				}
			
			
		}
		pw.println(ans);
		pw.flush();
	}
	static class MScanner {
		StringTokenizer st;
		BufferedReader br;
		public MScanner(InputStream system) {
			br = new BufferedReader(new InputStreamReader(system));
		}
 
		public MScanner(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 int[] takearr(int n) throws IOException {
	        int[]in=new int[n];for(int i=0;i<n;i++)in[i]=nextInt();
	        return in;
		}
		public long[] takearrl(int n) throws IOException {
	        long[]in=new long[n];for(int i=0;i<n;i++)in[i]=nextLong();
	        return in;
		}
		public Integer[] takearrobj(int n) throws IOException {
	        Integer[]in=new Integer[n];for(int i=0;i<n;i++)in[i]=nextInt();
	        return in;
		}
		public Long[] takearrlobj(int n) throws IOException {
	        Long[]in=new Long[n];for(int i=0;i<n;i++)in[i]=nextLong();
	        return in;
		}
		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 boolean ready() throws IOException {
			return br.ready();
		}
 
		public void waitForInput() throws InterruptedException {
			Thread.sleep(3000);
		}
	}
}