You are given two arrays a and b, both of length n. All elements of both arrays are from 0 to n-1.

You can reorder elements of the array b (if you want, you may leave the order of elements as it is). After that, let array c be the array of length n, the i-th element of this array is c_i = (a_i + b_i) \% n, where x \% y is x modulo y.

Your task is to reorder elements of the array b to obtain the lexicographically minimum possible array c.

Array x of length n is lexicographically less than array y of length n, if there exists such i (1 ≤ i ≤ n), that x_i < y_i, and for any j (1 ≤ j < i) x_j = y_j.

Input

The first line of the input contains one integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the number of elements in a, b and c.

The second line of the input contains n integers a_1, a_2, ..., a_n (0 ≤ a_i < n), where a_i is the i-th element of a.

The third line of the input contains n integers b_1, b_2, ..., b_n (0 ≤ b_i < n), where b_i is the i-th element of b.

Output

Print the lexicographically minimum possible array c. Recall that your task is to reorder elements of the array b and obtain the lexicographically minimum possible array c, where the i-th element of c is c_i = (a_i + b_i) \% n.

Examples

Input


4
0 1 2 1
3 2 1 1


Output


1 0 0 2 


Input


7
2 5 1 5 3 4 3
2 4 3 5 6 5 1


Output


0 0 0 1 0 2 4 


import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.TreeSet;


public class Solution 
{
	static class Node
	{
		int start;
		int end ;
		
		
		Node(int start , int end)
		{
			this.start = start;
			this.end = end;
		}
	}
	InputStream is;
	PrintWriter out;
	

	
	
	//Testcase 2
	String OUTPUT = "7";
	String POUTPUT = "";
	String INPUT = "abba";
	
	
	
	
	void solve()
	{
		int n = ni();
        int arr[] = na(n);
        
        TreeSet<Integer> tree = new TreeSet<Integer>();
        HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>();
        for(int i=0;i<n;i++)
        {
        	int ele = ni();
        	tree.add(ele);
        	if(hash.containsKey(ele))
        	{
        		hash.put(ele, hash.get(ele)+1);
        	}
        	else
        		hash.put(ele, 1);
        }
        int c[]= new int[n];
        for(int i=0;i<n;i++)
        {
        
        	int ele = n-arr[i];
        	Integer large = tree.ceiling(ele);
//        	System.out.print(ele +" "+large+" "+hash.get(large));
//        	System.out.println(tree);
        	if(large==null)
        	{
        		int val = tree.pollFirst();
        		c[i] = (val+arr[i])%n;
        		if(hash.get(val)>1){
        			tree.add(val);
        			hash.put(val, hash.get(val)-1);
        		}
        	}
        	else
        	{
        		
        		c[i]= (large+arr[i])%n;
        		if(hash.get(large)>1){

        			hash.put(large, hash.get(large)-1);
        		}
        		else
        			tree.remove(large);
        	}
        	
        }
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<n;i++)
        {
        	sb.append(c[i]+" ");
        }
        System.out.println(sb);
//        System.out.print(Arrays.toString(c));   
	}

	
	
	void run() throws Exception
	{
//		is = oj ? System.in : new ByteArrayInputStream(INPUT.getBytes());
		is = System.in;
		out = new PrintWriter(System.out);
		
		long s = System.currentTimeMillis();
		solve();
		out.flush();
//		tr(System.currentTimeMillis()-s+"ms");
	}
	
	
	private static class BS {
        //  Binary search
        private static int binarySearch(int[] arr, int ele) {
            int low = 0;
            int high = arr.length - 1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (arr[mid] == ele) {
                    return mid;
                } else if (ele < arr[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return -1;
        }

        //    First occurence using binary search
        private static int binarySearchFirstOccurence(int[] arr, int ele) {
            int low = 0;
            int high = arr.length - 1;
            int ans = -1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (arr[mid] == ele) {
                    ans = mid;
                    high = mid - 1;
                } else if (ele < arr[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return ans;
        }


        //    Last occurenece using binary search
        private static int binarySearchLastOccurence(int[] arr, int ele) 
        {
            int low = 0;
            int high = arr.length - 1;
            int ans = -1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (arr[mid] == ele) {
                    ans = mid;
                    low = mid + 1;
                } else if (ele < arr[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return ans;
        }
        
        
        //just smaller or equal element using binary search
        static int binarySearchCountSmaller(int arr[], int key)  
        { 
        	int n  = arr.length;
            int left = 0, right = n; 
          
            int mid = 0; 
            while (left < right) { 
            mid = (right + left) >> 1; 
          
            if (arr[mid] == key) { 
                  
                while (mid+1<n && arr[mid + 1] == key) 
                mid++; 
                break; 
            } 
            else if (arr[mid] > key) 
                right = mid; 
          
            else
                left = mid + 1; 
            } 
            while (mid > - 1 && arr[mid] > key) 
            mid--; 
          
            return mid + 1; 
        } 
        
//        just greater or equal element using binary search
        static int ceilSearch(int arr[], int low, int high, int x, boolean visited[]) 
        { 
          int i;     
           
          if(x <= arr[low]) 
            return low;   
          for(i = low; i < high; i++) 
          { 
            if(arr[i] == x && visited[i] == true) 
              return i; 
           
            if(arr[i] < x && arr[i+1] >= x) 
               return i+1; 
          }          
           
          return -1; 
        } 
        
        
    }
	public static void main(String[] args) throws Exception { new Solution().run(); }
	
	private byte[] inbuf = new byte[1024];
	public int lenbuf = 0, ptrbuf = 0;
	
	private int readByte()
	{
		if(lenbuf == -1)throw new InputMismatchException();
		if(ptrbuf >= lenbuf){
			ptrbuf = 0;
			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
			if(lenbuf <= 0)return -1;
		}
		return inbuf[ptrbuf++];
	}
	
	private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
	private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
	
	private double nd() { return Double.parseDouble(ns()); }
	private char nc() { return (char)skip(); }
	
	private String ns()
	{
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}
	
	private char[] ns(int n)
	{
		char[] buf = new char[n];
		int b = skip(), p = 0;
		while(p < n && !(isSpaceChar(b))){
			buf[p++] = (char)b;
			b = readByte();
		}
		return n == p ? buf : Arrays.copyOf(buf, p);
	}
	
	private char[][] nm(int n, int m)
	{
		char[][] map = new char[n][];
		for(int i = 0;i < n;i++)map[i] = ns(m);
		return map;
	}
	
	private int[] na(int n)
	{
		int[] a = new int[n];
		for(int i = 0;i < n;i++)a[i] = ni();
		return a;
	}
	
	private long[] nla(int n)
	{
		long[] a = new long[n];
		for(int i = 0;i < n;i++)a[i] = nl();
		return a;
	}
	private int ni()
	{
		int num = 0, b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private long nl()
	{
		long num = 0;
		int b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
	private void tr(Object... o) 
	{
		if(!oj)
		{
			System.out.println(Arrays.deepToString(o)); 
			if(POUTPUT.equals(OUTPUT))
			{
				System.out.print("Verdict OK");
			}
			else
			{
				System.out.println("Wrong Answer");
				System.out.println("Participant's Output : " + POUTPUT);
				System.out.println("Jury's Answer : " + OUTPUT);
			}
		}
	}

}

