Problem: This week Arkady wanted to cook some pancakes (to follow ancient traditions) and make a problem about that. But then he remembered that one can't make a problem about stacking pancakes without working at a specific IT company, so he decided to bake the Napoleon cake instead.

To bake a Napoleon cake, one has to bake n dry layers first, and then put them on each other in one stack, adding some cream. Arkady started with an empty plate, and performed the following steps n times: 

  * place a new cake layer on the top of the stack; 
  * after the i-th layer is placed, pour a_i units of cream on top of the stack. 



When x units of cream are poured on the top of the stack, top x layers of the cake get drenched in the cream. If there are less than x layers, all layers get drenched and the rest of the cream is wasted. If x = 0, no layer gets drenched.

<image> The picture represents the first test case of the example.

Help Arkady determine which layers of the cake eventually get drenched when the process is over, and which don't.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 20 000). Description of the test cases follows.

The first line of each test case contains a single integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the number of layers in the cake.

The second line of each test case contains n integers a_1, a_2, …, a_n (0 ≤ a_i ≤ n) — the amount of cream poured on the cake after adding each layer.

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

Output

For each test case, print a single line with n integers. The i-th of the integers should be equal to 1 if the i-th layer from the bottom gets drenched, and 0 otherwise.

Example

Input


3
6
0 3 0 0 1 3
10
0 0 0 1 0 5 0 0 0 2
3
0 0 0


Output


1 1 0 1 1 1 
0 1 1 1 1 1 0 0 1 1 
0 0 0 

Solution (in JAVA):

Solution:
//package div3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;

public class board
{
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            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 gcd(long a, long b)
    {
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }

    // method to return LCM of two numbers
    static long lcm(long a, long b)
    {
        return (a / gcd(a, b)) * b;
    }
    static void sieveOfEratosthenes(int n)
    {
        // Create a boolean array "prime[0..n]" and initialize
        // all entries it as true. A value in prime[i] will
        // finally be false if i is Not a prime, else true.

        for(int i=0;i<n;i++)
            prime[i] = true;

        for(int p = 2; p*p <=n; p++)
        {
            // If prime[p] is not changed, then it is a prime
            if(prime[p] == true)
            {
                // Update all multiples of p
                for(int i = p*p; i <= n; i += p)
                    prime[i] = false;
            }
        }


    }
    static boolean[] prime;

    static int UpperBound(long a[], long x) {// x is the key or target value
        int lo = 0, hi = a.length;
        int ans = hi+1;
        while(lo < hi) {
            int mid = (lo + hi)/2;
            if(x<a[mid])
                hi = mid;
            else if(x == a[mid]){
                ans = mid;
                lo = mid + 1;
            }
            else lo = mid+1;
        }
        return Math.min(ans,lo);
    }
    static int mod = (int)(1e9+7);
    static long binomialCoeff(int n, int k)
    {
        long C[] = new long[k + 1];

        // nC0 is 1
        C[0] = 1;

        for (int i = 1; i <= n; i++) {
            // Compute next row of pascal
            // triangle using the previous row
            for (int j = Math.min(i, k); j > 0; j--)
                C[j] = (C[j]%mod + C[j - 1]%mod)%mod;
        }
        return C[k];
    }
    static int fact(int n){
        if(n == 1 || n == 0)return 1;
        return n*fact(n-1);
    }
    static int segs(int[] given,boolean[] marked){
        int size = 0;
        for(int i=0;i<given.length;i++){
            if(!marked[i]) size++;
        }
        int[] a = new int[size];
        int k = 0;
        for(int i=0;i<given.length;i++){
            if(!marked[i]) a[k++] = given[i];
        }
        int n = a.length;
        int numSegs = 0;
        for(int i=0;i<n;){
            int j = i;
            numSegs++;
            marked[j] = true;
            while(j<n && a[j] == a[i]){
                j++;
            }
            i = j;
        }
        return numSegs;
    }
    public static void main(String[] args)
    {

        FastReader sc= new FastReader();
        PrintWriter out = new PrintWriter(System.out);
        int t = sc.nextInt();


        while(t-->0){
            int n = sc.nextInt();
            int[] a = new int[n];
            int[] diff = new int[n+1];
            for(int i=0;i<n;i++){
                a[i] = sc.nextInt();
                int leftBoundary = i-a[i]+1;
                leftBoundary = Math.max(leftBoundary,0);
                int rightBoundary = i+1;
                diff[leftBoundary] += 1;
                diff[rightBoundary] -= 1;
            }
            for(int i=0;i<n;i++){
                diff[i+1] += diff[i];
            }
            for(int i=0;i<n;i++){
                int state = 0;
                if(diff[i] > 0) state = 1;
                out.print(state+" ");
            }
            out.println();



        }
        out.close();

    }


}