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.*;
import java.util.*;
public class Main {
     static ArrayList a[]=new ArrayList[3000001];
     static boolean prime[]=new boolean [3000001];
     
     public static void main(String[]args)
    {
        InputReader in=new InputReader(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        int n=in.nextInt();
        int a[]=new int[n];
        int b[]=new int [n];
        int freq[]=new int[n];
        for(int i=0;i<n;i++)
        	a[i]=in.nextInt();
        TreeMap<Integer,Integer>tr=new TreeMap<>();
        for(int i=0;i<n;i++)
        {
        	b[i]=in.nextInt();
        	freq[b[i]]++;
        	if(tr.containsKey(b[i]))
        		tr.put(b[i], tr.get(b[i])+1);
        	else
        		tr.put(b[i], 1);
        }
        int c[]=new int[n];
        for(int i=0;i<n;i++) {
        	int val=n-a[i];
        	if(tr.ceilingKey(val)!=null) {
        		int got=tr.ceilingKey(val);
        		freq[got]--;
        		c[i]=(got+a[i])%n;
        		if(freq[got]==0)
        			tr.remove(got);
        	}
        	else
        	{
        		int got=tr.firstKey();
        		freq[got]--;
        		c[i]=(got+a[i])%n;
        		if(freq[got]==0)
        			tr.remove(got);
        	}
        	
        }
        
        for(int i=0;i<n;i++)
        	pw.print(c[i]+" ");
        pw.flush();
        pw.close();
 
    }
    private static void debug(Object... o) {
        System.out.println(Arrays.deepToString(o));
    }
   static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        { 
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
        static class tri implements Comparable<tri> {
            int p, c, l;
 
            tri(int p, int c, int l) {
                this.p = p;
                this.c = c;
                this.l = l;
            }
 
            public int compareTo(tri o) {
                return Integer.compare(l, o.l);
            }
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
   public static long modularExponentiation(long x,long n,long M)
   {
       long result=1;
       while(n>0)
       {
           if(n % 2 ==1)
               result=(result%M * x%M)%M;
           x=(x%M * x%M)%M;
           n=n/2;
       }
       return result;
   }
   
   public static long modInverse(int A,int M)
   {
       return modularExponentiation(A,M-2,M);
   }
   
   public static long modInverse(long A,long M)
   {
       return modularExponentiation(A,M-2,M);
   }
    static class pair implements Comparable<pair>{
        Long x;
        Long y;

        pair(long x2,long l){
            this.x=x2;
            this.y=l;
        }
        
        public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
            return result;
            }  
         public String toString(){
            return (x+" "+y);
        }
  }
    public static long GCD(long a,long b)
    {
        if(b==0)
            return a;
        else
            return GCD(b,a%b);
    }
    public static long[] shuffle(long[] a, Random gen){ 
        for(int i = 0, n = a.length;i < n;i++){ 
            int ind = gen.nextInt(n-i)+i; 
            long d = a[i]; 
            a[i] = a[ind]; 
            a[ind] = d; 
        } 
        return a; 
    }
  static class query{
      Integer x;
      Integer y;
      Long z;
      query(int x,int y,long z){
          this.x=x;
          this.y=y;
          this.z=z;
      }
      
	public String toString() {
    	  return ((x+" "+y+" "+z));
      }
  }
  static class Segment{ 
		int seg[];
		int a[];
		int lazy[];
	    Segment (int n,int b[]){
			seg=new int[4*n];
			lazy=new int[4*n];
			a=new int[b.length];
			a=b.clone();
		}
	    public void build(int node,int start,int end) {
	    	if(start==end) {
	    		seg[node]=a[start];
	    		return ;
	    	}
	    	int mid=(start+end)/2;
	    	build(2*node+1,start,mid);
	    	build(2*node+2,mid+1,end);
	    	seg[node]=seg[2*node+1]+seg[2*node+2];
	    }
	    public void update(int node,int start,int end,int id,int val) {
	    	if(start==end) {
	    		seg[node]=a[start]=val;
	    		return;
	    	}
	    	int mid=(start+end)/2;
	    	if(id>=start && id<=mid) {
	    		update(2*node+1,start,mid,id,val);
	    	}
	    	else
	    		update(2*node+2,mid+1,end,id,val);
	    	seg[node]=seg[2*node+1]+seg[2*node+2];
	    }
	    public int query(int node,int start,int end,int l,int r) {
	    	if(l>end || r<start)
	    		return 0;
	    	if(start>=l && end<=r)
	    		return seg[node];
	    	
	    	int  mid=(start+end)/2;
	    	return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
	    }
	    public void updateRange(int node,int start,int end,int l,int r,int val) {
	    	if(lazy[node]!=0) {
	    		if(start!=end) {
	    			lazy[2*node+1]+=lazy[node];
	    			lazy[2*node+2]+=lazy[node];
	    		}
	    		lazy[node]=0;
	    	}
	    	if(l>end || r<start)
	    		return ;
	    	if(start>=l && end<=r) {
	    		seg[node]=(end-start+1)*val;
	    		if(start!=end) {
	    			lazy[2*node+1]+=val;
	    			lazy[2*node+2]+=val;
	    		}
	    		lazy[node]=0;
	    		return ;
	    	}
	    	int mid=(start+end)/2;
	    	updateRange(2*node+1,start,mid,l,r,val);
	    	updateRange(2*node+2,mid+1,end,l,r,val);
	    	seg[node]=seg[2*node+1]+seg[2*node+2];
	    }
	    public int queryRange(int node,int start,int end,int l,int r) {
	    	if(l>end || r<start)
	    		return 0;
	    	if(lazy[node]!=0) {
	    		seg[node]=(end-start+1)*lazy[node];
	    		if(start!=end) {
	    			lazy[2*node+1]+=lazy[node];
	    			lazy[2*node+2]+=lazy[node];
	    		}
	    		lazy[node]=0;
	    	}
	    	if(start>=l && end<=r)
	    		return seg[node];
	    	
	    	int  mid=(start+end)/2;
	    	return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
	    }
	    
	}
    
}