#include #include #include using namespace std; const int N = 100005; int n, m, ans, T, qans, cnt, p[N << 2], d[N], a[N], c[N], f[N]; map M; const int INF = 1009000007; void sgtBuild(int now, int l, int r) { p[now] = 0; if (l == r) return; int mid = (l + r) >> 1; sgtBuild(now << 1, l, mid); sgtBuild(now << 1 | 1, mid + 1, r); } void sgtChange(int now, int l, int r, int pos, int val) { if (l == r) { p[now] = val; return; } int mid = (l + r) >> 1; if (pos <= mid) sgtChange(now << 1, l, mid, pos, val); else sgtChange(now << 1 | 1, mid + 1, r, pos, val); p[now] = max(p[now << 1], p[now << 1 | 1]); } void sgtQuery(int now, int l, int r, int ll, int rr) { if (ll <= l && r <= rr) { qans = max(qans, p[now]); return; } int mid = (l + r) >> 1; if (ll <= mid) sgtQuery(now << 1, l, mid, ll, rr); if (rr > mid) sgtQuery(now << 1 | 1, mid + 1, r, ll, rr); } int main() { scanf("%d", &T); while (T--) { cnt = 0; scanf("%d", &n); M.clear(); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); M[a[i]] = 0; } for (map::iterator it = M.begin(); it != M.end(); ++it) it->second = ++cnt; for (int i = 1; i <= n; ++i) { a[i] = M[a[i]]; c[i] = 0; } sgtBuild(1, 1, n); for (int i = 1; i <= n; ++i) { qans = 0; if (a[i] > 1) sgtQuery(1, 1, n, 1, a[i] - 1); f[i] = qans + 1; if (f[i] > c[a[i]]) { c[a[i]] = f[i]; sgtChange(1, 1, n, a[i], f[i]); } } d[0] = 0; for (int i = 1; i <= n; ++i) d[i] = INF; for (int i = 1; i < n; ++i) { ans = d[f[i]-1] + 1; d[f[i]] = min(d[f[i]], ans); printf("%d ", ans); } ans = d[f[n]-1] + 1; d[f[n]] = min(d[f[n]], ans); printf("%d", ans); putchar('\n'); } }