#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i,n) for (int i = 0; i < (int)(n); i++)
#include <vector>
#define rep(i,n) for (int i = 0; i < (int)(n); i++)
const int N = 8005;
int low[N], dfn[N], id[N], stack[N], inS[N];
int stop, ts, idn;
vector <int> E[N];

void dfs(int u) {
    stack[stop++] = u;
    dfn[u] = ts++;
    low[u] = dfn[u];
    inS[u] = 1;
    rep (i, E[u].size()) {
        int v = E[u][i];
        if (dfn[v] == -1) {
            dfs(v);
            low[u] = min(low[u], low[v]);
        } else if (inS[v]) {
            low[u] = min(low[u], dfn[v]);
        }
    }
    if (low[u] == dfn[u]) {
        while (stack[--stop] != u) {
            id[stack[stop]] = idn;
            inS[stack[stop]] = 0;
        }
        id[u] = idn++;
        inS[u] = 0;
    }
}

void SCC(int n) {
    idn = ts = stop = 0;
    rep (i, n) dfn[i] = -1, inS[i] = 0;
    rep (i, n)
        if (dfn[i] == -1) 
            dfs(i);
}

bool twosat(int n, vector <bool> &res) {
    rep (i, n) if (id[i * 2] == id[i * 2 + 1]) return 0;
    static int c[N];
    static vector <int> block[N];
    rep (i, idn) block[i].clear(), c[i] = -1;
    rep (i, n + n) block[id[i]].push_back(i);
    rep (i, idn) {
        c[i] = 1;
        rep (j, block[i].size()) {
            int u = block[i][j];
            rep (k, E[u].size())
                if (c[id[E[u][k]]] == 0) c[i] = 0;
            if (c[id[u ^ 1]] == 1) c[i] = 0;
        }
    }
    res.resize(n);
    rep (i, n) res[i] = c[id[i * 2]];
    return 1;
}


int use(int x) { return x * 2; }
int notuse(int x) { return x * 2 + 1; }

int main() {
#ifdef cwj
    freopen("in", "r", stdin);
#endif
    int Tc;
    scanf("%d", &Tc);
    while (Tc--) {
        int n, m;
        static int a[2005], L[2005], R[2005], ans[2005];
        scanf("%d", &n);
        map < int, vector <int> > mp;
        rep (i, n) {
            scanf("%d", &a[i]);
            mp[a[i]].push_back(i);
        }
        m = 0;
        for (map < int, vector <int> >::iterator it = mp.begin(); it != mp.end(); it++) {
            vector <int> &v = it->second;
            if (v.size() == 4) {
                L[m] = v[0];
                R[m] = v[1];
                L[m + 1] = v[2];
                R[m + 1] = v[3];
                L[m + 2] = v[0];
                R[m + 2] = v[2];
                L[m + 3] = v[1];
                R[m + 3] = v[3];
                rep (o, 4) {
                    E[use(m + o)].clear();
                    E[notuse(m + o)].clear();
                }
                E[use(m)].push_back(use(m + 1));
                E[use(m + 1)].push_back(use(m));
                E[notuse(m)].push_back(notuse(m + 1));
                E[notuse(m + 1)].push_back(notuse(m));
                E[use(m + 2)].push_back(use(m + 3));
                E[use(m + 3)].push_back(use(m + 2));
                E[notuse(m + 2)].push_back(notuse(m + 3));
                E[notuse(m + 3)].push_back(notuse(m + 2));
                E[use(m)].push_back(notuse(m + 2));
                E[notuse(m)].push_back(use(m + 2));
                E[use(m + 2)].push_back(notuse(m));
                E[notuse(m + 2)].push_back(use(m));
                m += 4;
            } else {
                L[m] = v[0];
                R[m] = v[1];
                E[use(m)].clear();
                E[notuse(m)].clear();
                E[notuse(m)].push_back(use(m));
                m++;
            }
        }
        rep (i, m) rep (j, i)
            if (!((L[i] < L[j] && R[i] < R[j]) || (L[j] < L[i] && R[j] < R[i]))) {
                E[use(i)].push_back(notuse(j));
                E[use(j)].push_back(notuse(i));
            }
        SCC(m + m);
        vector <bool> res;
        twosat(m, res);
        rep (i, m)
            if (res[i]) {
                ans[L[i]] = 0;
                ans[R[i]] = 1;
            }
        rep (i, n) printf("%d", ans[i]);
        puts("");
    }
}

