import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
for(int i=1 ; i<=t ; i++){
int n=sc.nextInt();
int pre[]=new int[n];
int in[] = new int[n];
for(int j=0 ; j<n ; j++) {
pre[j]=sc.nextInt();
in[j]=pre[j];
}
Arrays.sort(in);
int k1=sc.nextInt();
int k2=sc.nextInt();
Main m=new Main();
BST bt = m.new BST(in);
// BST bt = m.new BST(pre , in);
System.out.print("# Preorder : ");
bt.preOrder();
// for(int j=0 ; j<n ; j++)
// System.out.print(pre[j]+" ");
System.out.print("# Nodes within range are : ");
bt.inRange(k1 , k2);
System.out.println();
}
}
public class BST {
private class Node{
int data;
Node left=null;
Node right=null;
}
private Node root;
public BST (int [] inorder) {
this.root=construct(inorder , 0 , inorder.length-1);
}
private Node construct(int [] inorder , int start , int end) {
if(start>end) return null;
if(start==end) {
Node base = new Node();
base.data=inorder[start];
return base;
}
int mid=(start+end)/2;
Node node = new Node();
node.data=inorder[mid];
node.left=construct(inorder , start , mid-1);
node.right=construct(inorder , mid+1 , end);
return node;
}
BST(int [] pre , int [] in){
this.root=pre_in_generate(pre , 0 , pre.length-1 , in , 0 , in.length-1);
}
private Node pre_in_generate(int [] pre , int preS , int preE , int [] in , int inS , int inE) {
if(preS>preE || inS>inE)
return null;
int i=inS;
while(i<inE) {
if(pre[preS]==in[i])
break;
i++;
}
Node curr = new Node();
curr.data = in[i];
curr.left = pre_in_generate(pre , preS+1 , preS+(i-inS) , in , inS , i-1);
curr.right = pre_in_generate(pre , preS+(i-inS)+1 , preE , in , i+1 , inE);
return curr;
}
public void preOrder() {
this.preOrder(this.root);
System.out.println();
}
private void preOrder(Node node) {
if(node==null) return;
System.out.print(node.data+" ");
preOrder(node.left);
preOrder(node.right);
}
public void display() {
display(this.root);
}
private void display(Node node) {
if(node==null) return;
String s="";
if(node.left!=null) s=s + node.left.data + " => ";
else s=s+" ... => ";
s = s+node.data;
if(node.right!=null) s=s+" <= "+node.right.data;
else s=s+" <= ... ";
System.out.println(s);
if(node.left!=null)
display(node.left);
if(node.right!=null)
display(node.right);
}
public void inRange(int k1 , int k2) {
this.inRange(this.root , k1 , k2);
}
private void inRange(Node node , int k1 , int k2) {
if(node==null) return;
if(node.data<k1)
inRange(node.right , k1 , k2);
if(node.data>k2)
inRange(node.left , k1 , k2);
if(node.data<=k2 && node.data>=k1) {
inRange(node.left , k1 , k2);
System.out.print(node.data+" ");
inRange(node.right , k1 , k2);
}
}
}
}