description: n players are playing a game. 
  
  There are two different maps in the game. For each player, we know his strength on each map. When two players fight on a specific map, the player with higher strength on that map always wins. No two players have the same strength on the same map. 
  
  You are the game master and want to organize a tournament. There will be a total of n-1 battles. While there is more than one player in the tournament, choose any map and any two remaining players to fight on it. The player who loses will be eliminated from the tournament. 
  
  In the end, exactly one player will remain, and he is declared the winner of the tournament. For each player determine if he can win the tournament.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 100) — the number of test cases. The description of test cases follows.
  
  The first line of each test case contains a single integer n (1 ≤ n ≤ 10^5) — the number of players.
  
  The second line of each test case contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^9, a_i ≠ a_j for i ≠ j), where a_i is the strength of the i-th player on the first map. 
  
  The third line of each test case contains n integers b_1, b_2, ..., b_n (1 ≤ b_i ≤ 10^9, b_i ≠ b_j for i ≠ j), where b_i is the strength of the i-th player on the second map. 
  
  It is guaranteed that the sum of n over all test cases does not exceed 10^5.
  
  Output
  
  For each test case print a string of length n. i-th character should be "1" if the i-th player can win the tournament, or "0" otherwise.
  
  Example
  
  Input
  
  
  3
  4
  1 2 3 4
  1 2 3 4
  4
  11 12 20 21
  44 22 11 30
  1
  1000000000
  1000000000
  
  
  Output
  
  
  0001
  1111
  1
  
  Note
  
  In the first test case, the 4-th player will beat any other player on any game, so he will definitely win the tournament.
  
  In the second test case, everyone can be a winner. 
  
  In the third test case, there is only one player. Clearly, he will win the tournament.
solution: 
  import java.util.*;
  
  import java.io.*;
  import java.math.*;
  import java.sql.Array;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.SQLIntegrityConstraintViolationException;
  
  
  
  public class Main {
  	 private static class MyScanner {
  	        private static final int BUF_SIZE = 2048;
  	        BufferedReader br;
  	 
  	        private MyScanner() {
  	            br = new BufferedReader(new InputStreamReader(System.in));
  	        }
  	 
  	        private boolean isSpace(char c) {
  	            return c == '\n' || c == '\r' || c == ' ';
  	        }
  	 
  	        String next() {
  	            try {
  	                StringBuilder sb = new StringBuilder();
  	                int r;
  	                while ((r = br.read()) != -1 && isSpace((char)r));
  	                if (r == -1) {
  	                    return null;
  	                }
  	 
  	                sb.append((char) r);
  	                while ((r = br.read()) != -1 && !isSpace((char)r)) {
  	                    sb.append((char)r);
  	                }
  	                return sb.toString();
  	            } catch (IOException e) {
  	                e.printStackTrace();
  	            }
  	            return null;
  	        }
  	 
  	        int nextInt() {
  	            return Integer.parseInt(next());
  	        }
  	 
  	        long nextLong() {
  	            return Long.parseLong(next());
  	        }
  	 
  	        double nextDouble() {
  	            return Double.parseDouble(next());
  	        }
  	    }
  	  static class Reader{
  		  
  			BufferedReader br;
  			StringTokenizer st;
  			public Reader() {
  				br = new BufferedReader(new InputStreamReader(System.in));
  			}
  			String next() 
  		    { 
  		        while (st == null || !st.hasMoreElements()) 
  		        { 
  		            try
  		            { 
  		                st = new StringTokenizer(br.readLine()); 
  		            } 
  		            catch (IOException  e) 
  		            { 
  		                e.printStackTrace(); 
  		            } 
  		        } 
  		        return st.nextToken(); 
  		    } 
  
  		    int nextInt() 
  		    { 
  		        return Integer.parseInt(next()); 
  		    } 
  
  		    long nextLong() 
  		    { 
  		        return Long.parseLong(next()); 
  		    } 
  
  		    double nextDouble() 
  		    { 
  		        return Double.parseDouble(next()); 
  		    } 
  
  		    String nextLine() 
  		    { 
  		        String str = ""; 
  		        try
  		        { 
  		            str = br.readLine(); 
  		        } 
  		        catch (IOException e) 
  		        { 
  		            e.printStackTrace(); 
  		        } 
  		        return str; 
  		    } 
  		}
  	 
  	  static long mod = (long)(1e9 + 7);
  	 
  	static void sort(long[] arr ) {
  		 ArrayList<Long> al = new ArrayList<>();
  		 for(long e:arr) al.add(e);
  		 Collections.sort(al);
  		 for(int i = 0 ; i<al.size(); i++) arr[i] = al.get(i);
  	 }
  	static void sort(int[] arr ) {
  		 ArrayList<Integer> al = new ArrayList<>();
  		 for(int e:arr) al.add(e);
  		 Collections.sort(al);
  		 for(int i = 0 ; i<al.size(); i++) arr[i] = al.get(i);
  	 }
  	
  	static void sort(char[] arr) {
  		ArrayList<Character> al = new ArrayList<Character>();
  		for(char cc:arr) al.add(cc);
  		Collections.sort(al);
  		for(int i = 0 ;i<arr.length ;i++) arr[i] = al.get(i);
  	}
  
  	static long mod_mul(  long... a) {
  		long ans = a[0]%mod;
  		for(int i = 1 ; i<a.length ; i++) {
  			ans = (ans * (a[i]%mod))%mod;
  		}
  		
  		return ans;
  	}
  	static long mod_sum( long... a) {
  		long ans = 0;
  		for(long e:a) {
  			ans = (ans + e)%mod;
  		}
  		return ans;
  	}
  	 static long gcd(long a, long b)
  	  {      
  	     if (b == 0)
  	        return a;
  	     return gcd(b, a % b); 
  	  }
  	 static boolean[] prime(int num) {
  			boolean[] bool = new boolean[num];
  		     
  		      for (int i = 0; i< bool.length; i++) {
  		         bool[i] = true;
  		      }
  		      for (int i = 2; i< Math.sqrt(num); i++) {
  		         if(bool[i] == true) {
  		            for(int j = (i*i); j<num; j = j+i) {
  		               bool[j] = false;
  		            }
  		         }
  		      }
  		      if(num >= 0) {
  		    	  bool[0] = false;
  		    	  bool[1] = false;
  		      }
  		      
  		      return bool;
  		}
  
  	 static long modInverse(long a, long m)
  	    {
  	        long g = gcd(a, m);
  	       
  	          return   power(a, m - 2, m);
  	        
  	    }
  	   static long lcm(long a , long b) {
  		   return (a*b)/gcd(a, b);
  	   }
  	   static int lcm(int a , int b) {
  		   return (int)((a*b)/gcd(a, b));
  	   }
  	 static long power(long x, long y, long m){
  	        if (y == 0) return 1; long p = power(x, y / 2, m) % m; p = (int)((p * (long)p) % m);
  	        if (y % 2 == 0) return p; else return (int)((x * (long)p) % m); }
  	   
       static class Combinations{
  	    	 private long[] z;
  	    	 private long[] z1;
  	    	 private long[] z2;
  	    	 private long mod;
  	    	  public Combinations(long N , long mod) {
  	    		  this.mod = mod;
  				z = new long[(int)N+1];
  				z1 = new long[(int)N+1];
  				z[0] = 1;
  				for(int i =1 ; i<=N ; i++) z[i] = (z[i-1]*i)%mod;
  			     z2 = new long[(int)N+1];
  				z2[0] = z2[1] = 1;
  			    for (int i = 2; i <= N; i++)
  			        z2[i] = z2[(int)(mod % i)] * (mod - mod / i) % mod;
  			    
  			    
  			    z1[0] = z1[1] = 1;
  			    
  			    for (int i = 2; i <= N; i++)
  			        z1[i] = (z2[i] * z1[i - 1]) % mod;
  			}
  	    	  long fac(long n) {
  	    		  return z[(int)n];
  	    	  }
  	    	  long invrsNum(long n) {
  	    		  return z2[(int)n];
  	    	  }
  	    	  long invrsFac(long n) {
  	    		  return invrsFac((int)n);
  	    	  }
  	    	  long ncr(long N, long R)
  	    	  {		if(R<0 || R>N ) return 0;
  	    		    long ans = ((z[(int)N] * z1[(int)R])
  	    		              % mod * z1[(int)(N - R)])
  	    		             % mod;
  	    		    return ans;
  	    		}
  	      }
  	      static class DisjointUnionSets {
  			    int[] rank, parent;
  			    int n;
  			  
  			    public DisjointUnionSets(int n)
  			    {
  			        rank = new int[n];
  			        parent = new int[n];
  			        this.n = n;
  			        makeSet();
  			    }
  			  
  			    void makeSet()
  			    {
  			        for (int i = 0; i < n; i++) {
  			          
  			            parent[i] = i;
  			        }
  			    }
  			  
  			    int find(int x)
  			    {
  			        if (parent[x] != x) {
  			        
  			            parent[x] = find(parent[x]);
  			  
  			        }
  			  
  			        return parent[x];
  			    }
  			  
  			    void union(int x, int y)
  			    {
  			        int xRoot = find(x), yRoot = find(y);
  			  
  			        if (xRoot == yRoot)
  			            return;
  			  
  			        if (rank[xRoot] < rank[yRoot])
  			  
  			            parent[xRoot] = yRoot;
  			  
  			        else if (rank[yRoot] < rank[xRoot])
  			  
  			            parent[yRoot] = xRoot;
  			  
  			        else
  			        {
  			            parent[yRoot] = xRoot;
  			  
  			            rank[xRoot] = rank[xRoot] + 1;
  			        }
  			    }
  			}
  	      static int max(int... a ) {
  	    	  int max = a[0];
  	    	  for(int e:a) max = Math.max(max, e);
  	    	  return max;
  	      }
  	      static long max(long... a ) {
  	    	  long max = a[0];
  	    	  for(long e:a) max = Math.max(max, e);
  	    	  return max;
  	      }
  	      static int min(int... a ) {
  	    	  int min = a[0];
  	    	  for(int e:a) min = Math.min(e, min);
  	    	  return min;
  	      }
  	      static long min(long... a ) {
  	    	  long min = a[0];
  	    	  for(long e:a) min = Math.min(e, min);
  	    	  return min;
  	      }
  	      static int[] KMP(String str) {
  	    	  int n = str.length();
  	    	  int[] kmp = new int[n];
  	    	  for(int i = 1 ; i<n ; i++) {
  	    		  int j = kmp[i-1];
  	    		  while(j>0 && str.charAt(i) != str.charAt(j)) {
  	    			  j = kmp[j-1];
  	    		  }
  	    		  if(str.charAt(i) == str.charAt(j)) j++;
  	    		  kmp[i] = j;
  	    	  }
  	    	  
  	    	  return kmp;
  	      }
  	      
  	      
  /************************************************ Query **************************************************************************************/	  
  	 
  /***************************************** 		Sparse Table	********************************************************/
  	      static class SparseTable{
  	    		
  	    		private long[][] st;
  	    		
  	    		SparseTable(long[] arr){
  	    			int n = arr.length;
  	    			st = new long[n][25];
  	    			log = new int[n+2];
  	    			build_log(n+1);
  	    			build(arr);
  	    		}
  	    		
  	    		private void build(long[] arr) {
  	    			int n = arr.length;
  	    			
  	    			for(int i = n-1 ; i>=0 ; i--) {
  	    				for(int j = 0 ; j<25 ; j++) {
  	    					int r = i + (1<<j)-1;
  	    					if(r>=n) break;
  	    					if(j == 0 ) st[i][j] = arr[i];
  	    					else st[i][j] = Math.min(st[i][j-1] , st[ i + ( 1 << (j-1) ) ][ j-1 ] );
  	    				}
  	    			}
  	    		}
  	    		public long gcd(long a  ,long b) {
  	    			if(a == 0) return b;
  	    			return gcd(b%a , a);
  	    		}
  	    		public long query(int l ,int r) {
  	    			int w = r-l+1;
  	    			int power = log[w];
  	    			return Math.min(st[l][power],st[r - (1<<power) + 1][power]);
  	    		}
  	    		private int[] log;
  	    		void build_log(int n) {
  	    			log[1] = 0;
  	    			for(int i = 2 ; i<=n ; i++) {
  	    				log[i] = 1 + log[i/2];
  	    			}
  	    		}
  	    	}
  	      
  	      
  /********************************************************	Segement Tree	*****************************************************/
  /**
  	 	 static class SegmentTree{
  			 long[] tree;
  			 long[] arr;
  			 int n;
  			 SegmentTree(long[] arr){
  				 this.n = arr.length;
  				 tree = new long[4*n+1];
  				 this.arr = arr;
  				 buildTree(0, n-1, 1);
  			 }
  			 
  			 
  			  void buildTree(int s ,int e  ,int index ) {
  					if(s == e) {
  						tree[index] = arr[s];
  						return;
  					}
  				
  					int mid = (s+e)/2;
  					
  					buildTree( s,  mid, 2*index);
  					buildTree( mid+1, e, 2*index+1);
  					
  					tree[index] = Math.min(tree[2*index] , tree[2*index+1]);
  				}
  			  
  			 long query(int si ,int ei) {
  				 return query(0 ,n-1 , si ,ei , 1   );
  			 }
  			 private long query( int ss ,int se ,int qs , int qe,int index) {
  					
  					if(ss>=qs && se<=qe) return tree[index];
  					
  					if(qe<ss || se<qs) return (long)(1e17);
  					
  					int mid = (ss + se)/2;
  					long left = query( ss , mid , qs ,qe , 2*index);
  					long right= query(mid + 1 , se , qs ,qe , 2*index+1);
  					return Math.min(left, right);
  				}
  			 public void update(int index , int val) {
  				 arr[index] = val;
  				 for(long e:arr) System.out.print(e+" ");
  				 update(index , 0 , n-1 , 1);
  			 }
  			 private void update(int id ,int si , int ei , int index) {
  				 if(id < si || id>ei) return;
  				 if(si == ei ) { 
  					 tree[index] = arr[id];
  					 return;
  				 }
  				 if(si > ei) return;
  				 int mid = (ei + si)/2;
  					
  					update( id,  si, mid , 2*index);
  					update( id , mid+1, ei , 2*index+1);
  					
  					tree[index] = Math.min(tree[2*index] ,tree[2*index+1]);
  			 }
  			  
  		 }
  		 */
  
  /* ***************************************************************************************************************************************************/	 
  	 
  //	      static MyScanner sc = new MyScanner(); // only in case of less memory
  	      static Reader sc = new Reader();
  	 static StringBuilder sb = new StringBuilder();
  	 public static void main(String args[]) throws IOException {
  
  		 int tc = 1;
  		  tc = sc.nextInt();
  
  		 for(int i = 1 ; i<=tc ; i++) {
  
  //			 sb.append("Case #" + i + ": "  );	// During KickStart && HackerCup
  			 TEST_CASE();
  			  
  		 }
  		 System.out.print(sb);
  	 }
  
  	 static void TEST_CASE() {
  		 int n = sc.nextInt();
  		 int[] a = new int[n];
  		 int[] b = new int[n];
  		 for(int i =0 ; i<n ; i++)
  			 a[i] = sc.nextInt();
  		 for(int i =0 ; i<n ; i++)
  			 b[i] = sc.nextInt();
  		 
  		 ArrayList<Pair> al1 = new ArrayList<>() , al2 = new ArrayList<>();
  		 for(int i =0 ;  i<n ; i++) {
  			 al1.add(new Pair(a[i], i));
  			 al2.add(new Pair(b[i], i));
  		 }
  		 Collections.sort(al1);
  		 Collections.sort(al2);
  //		 System.out.println(al1);
  //		 System.out.println(al2);
  		 int[] min1 = new int[n];
  		 int[] min2 = new int[n];
  		 min1[0] = b[al1.get(0).ind];
  		 min2[0] = a[al2.get(0).ind];
  		 for(int i = 1 ; i<n ; i++) {
  			 min1[i] = min(min1[i-1] , b[al1.get(i).ind]);
  			 min2[i] = min(min2[i-1] , a[al2.get(i).ind]);
  		 }
  //		 for(int e:min1) System.out.print(e+" ");
  //		 System.out.println();
  //		 for(int e:min2) System.out.print(e+" ");
  //		 System.out.println();
  		 int[] ans1 = fnc(al1, al2, min1, min2);
  		 int[] ans2 = fnc(al2 ,al1, min2, min1);
  		 for(int i =0 ; i<n ; i++) {
  			 sb.append((ans1[i]|ans2[i]));
  		 }
  		 sb.append("\n");
  	 }
  	 static class Pair implements Comparable<Pair>{
  		 int pow;
  		 int ind;
  		 Pair(int pow , int ind){
  			 this.pow = pow;
  			 this.ind = ind;
  		 }
  		@Override
  		public int compareTo(Main.Pair o) {
  			return Integer.compare(o.pow, this.pow);
  		}
  		public String toString() {
  			return "{" + this.pow +"," + this.ind +"}";
  		}
  		 
  	 }
  
  	 static int[] fnc(ArrayList<Pair> a1 , ArrayList<Pair> a2,int[] min1 ,int[] min2) {
  		 int n = a1.size();
  		 int[] ans = new int[n];
  		 boolean[] visit1 = new boolean[n];
  		 boolean[] visit2 = new boolean[n];
  		 
  		 boolean arr1 = true;
  		 int i = 0;
  		 while(true) {
  			 if(arr1) {
  			 if(visit1[i]) break;
  			 visit1[i] = true;
  			 int min = min1[i];
  			 int l = 0, r = n-1;
  			 while(l<=r) {
  				 int m = (l+r)/2;
  				 if(a2.get(m).pow < min) r = m-1;
  				 else l = m+1;
  			 }
  			 if(r == -1) break;
  			 i = r;
  			 }else {
  				 if(visit2[i]) break;
  				 visit2[i] = true;
  				 int min = min2[i];
  				 int l = 0 , r = n-1;
  				 while(l<=r) {
  					 int m = (l+r)/2;
  					 if(a1.get(m).pow < min) r = m-1;
  					 else l = m+1;
  				 }
  				 if(r == -1) break;
  				 i = r;
  			 }
  			 arr1 = !arr1;
  		 }
  		 for( i = n-1 ; i>=0 ; i--) {
  			 if(visit1[i] ) {
  				 while(i>=0) {
  					 ans[a1.get(i).ind] |= 1;
  					 i--;
  				 }
  				 break;
  			 }
  		 }
  		 for( i = n-1 ; i>=0 ; i--) {
  			 if(visit2[i] ) {
  				 while(i>=0) {
  					 ans[a1.get(i).ind] |= 1;
  					 i--;
  				 }
  				 break;
  			 }
  		 }
  		 
  		 return ans;
  	 }
  
  }
  /*******************************************************************************************************************************************************/
  
  /**
  
   */
  
   
  
  