Problem: You are given an array a of length n consisting of zeros. You perform n actions with this array: during the i-th action, the following sequence of operations appears:

  1. Choose the maximum by length subarray (continuous subsegment) consisting only of zeros, among all such segments choose the leftmost one; 
  2. Let this segment be [l; r]. If r-l+1 is odd (not divisible by 2) then assign (set) a[(l+r)/(2)] := i (where i is the number of the current action), otherwise (if r-l+1 is even) assign (set) a[(l+r-1)/(2)] := i. 



Consider the array a of length 5 (initially a=[0, 0, 0, 0, 0]). Then it changes as follows:

  1. Firstly, we choose the segment [1; 5] and assign a[3] := 1, so a becomes [0, 0, 1, 0, 0]; 
  2. then we choose the segment [1; 2] and assign a[1] := 2, so a becomes [2, 0, 1, 0, 0]; 
  3. then we choose the segment [4; 5] and assign a[4] := 3, so a becomes [2, 0, 1, 3, 0]; 
  4. then we choose the segment [2; 2] and assign a[2] := 4, so a becomes [2, 4, 1, 3, 0]; 
  5. and at last we choose the segment [5; 5] and assign a[5] := 5, so a becomes [2, 4, 1, 3, 5]. 



Your task is to find the array a of length n after performing all n actions. Note that the answer exists and unique.

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1 ≤ t ≤ 10^4) — the number of test cases. Then t test cases follow.

The only line of the test case contains one integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the length of a.

It is guaranteed that the sum of n over all test cases does not exceed 2 ⋅ 10^5 (∑ n ≤ 2 ⋅ 10^5).

Output

For each test case, print the answer — the array a of length n after performing n actions described in the problem statement. Note that the answer exists and unique.

Example

Input


6
1
2
3
4
5
6


Output


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

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;
public class Solution{
  
    static long mod=998244353 ;
    static boolean f=true;
    static class pair implements Comparable<pair>{
        int a,b,c;
        pair(int x,int y,int z){
            a=x;b=y;c=z;
        }
        public int compareTo(pair t){
           if(c<t.c)    return 1;
		    else if(c==t.c)
		    {   if(a<t.a)    return -1;
		        else if(a>t.a)   return 1;
		        else    return 0;
		    }
		    else    return -1;
        }
    }
    // public static ArrayList<pair> bfs(String[] a,int r,int c){
    //     ArrayList<pair> ans=new ArrayList<>();
    //     Queue<pair> q=new LinkedList<>();
    //     int[][] dxy={{-1,0,1,0},{0,-1,0,1}};
    //     q.add(new pair(r,c));
    //     HashSet<String> h=new HashSet<>();
    //     while(!q.isEmpty()){
    //         pair f=q.poll();
    //         ans.add(f);h.add(f.a+" "+f.b);
    //         for(int i=0;i<4;i++){
    //             int dx=f.a+dxy[0][i];
    //             int dy=f.b+dxy[1][i];
    //             if(dx<0||dy<0||dx>=a.length||dy>=a.length||h.contains(dx+" "+dy)||
    //             a[dx].charAt(dy)=='1')
    //             continue;
    //             q.add(new pair(dx,dy));
    //             h.add(dx+" "+dy);
    //         }
    //     }
    //     return ans;
    // }    

    /*
    1 1 1 1 1 
3 3 3 
2 3 3 2 1 3 
1 
2 2 2 2 
4 4 4 1 4 
*/
    public static int pow(int a, int n) {
		long ans = 1;
		long base = a;
		while (n != 0) {
			if ((n & 1) == 1) {
				ans *= base;
				ans %= 1000000007;
			}
			base = (base * base) % 1000000007;
			n >>= 1;
		}
		return (int) ans % 1000000007;
	}
	public static int find(int x){
	    int i=1;int f=0;
	    while(x>0){
	        if((x&1)==0)f=i;
	        x>>=1;i++;
	    }
	    return f;
	}
	public static boolean good(int x){
	    
	    if((((x+1)&x))==0)
	    return true;
	    return false;
	}
	public static long f(long n){
	  
	   long val=2;
	   long preval=0;int i=1;
	   while(n>=val){
	       i++;
	       preval=val;
	       val=3*i+val-1;
	       
	   }
	   
	   return preval;
	   
	}
	public static boolean bfs(ArrayList<Integer>[] a,int n,int[] b){
	    Queue<Integer> p=new LinkedList<>();
	    boolean v[]=new boolean[n];
	    v[0]=true;int k=0;
	    if(b[0]!=0)return false;
	    p.add(0);int c=1;
	    HashSet<Integer> h=new HashSet<Integer>();
	    h.add(0);
	    while(!p.isEmpty()){
	        int f=p.poll();k++;
	        if(h.contains(f))h.remove(f);
	        else return false;
	        v[f]=true;
	        c--;
	
	       for(int i:a[f]){
	           if(!v[i]){
	           p.add(i);v[i]=true;}
	       }
	          if(c==0){
	              c=p.size();
	       if(h.size()!=0)return false;
	       for(int j=k;j<k+p.size();j++)
	       h.add(b[j]);
	   }
	    }
	    return true;
	    
	}
	public static int mi(int[] a,int k,int[] dp,int n){
	    int max=0;
	    for(int i=1;i*i<=k;i++){
	      //  System.out.println("fact "+i);
	        if(k%i==0&&(a[i-1]<a[k-1])){
	            
	      //  System.out.println(i+" "+dp[i-1]+" "+a[i-1]+" ");
	        max=Math.max(dp[i-1],max);}
	        if(k%i==0&&(a[k/i-1]<a[k-1])){
	            
	      //  System.out.println(i+" "+dp[i-1]+" "+a[i-1]+" ");
	        max=Math.max(dp[k/i-1],max);}
	        
	    }
	    return max;
	}
	    public static long dfs(ArrayList<Integer> a[],int n,boolean[] v,boolean s[]
	    ,long c[],int x){
     v[n]=true;
     if(n==x)
     s[n]=true;
     c[n]=1;
      
        for(int i=0;i<a[n].size();i++){
            if(!v[a[n].get(i)]){
         c[n]+= dfs(a,a[n].get(i),v,s,c,x);
         s[n]|=s[a[n].get(i)];
            }
           
        }
        return c[n];
        
    }
    public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
 
			int t = s.nextInt();
	StringBuilder st=new StringBuilder();
		while(t-- > 0) {
int n=s.nextInt();
int []a=new int[n+1];
PriorityQueue<pair> p=new PriorityQueue<>();
p.add(new pair(1,n,n));
int c=1;
while(!p.isEmpty()){
    pair f=p.poll();
    if(f.c<=0)break;
    int mid=0;
    if((f.c)%2==0)
    mid=(f.b+f.a-1)/2;
    else
    mid=(f.b+f.a)/2;
    a[mid]=c++;
    p.add((new pair(f.a,mid-1,mid-f.a)));
    p.add((new pair(mid+1,f.b,f.b-mid)));
}
for(int i=1;i<=n;i++)
st.append(a[i]+" ");
st.append("\n");
}
System.out.println(st);
   
/*
6 23 21
1 1000 0
2 1 2

0
40
41664916690999888

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


6 45 46
2 2 1
3 4 2
4 4 3
*/


  
	
        
    }
}