#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t--){
int n;
cin >> n;
vector<int> a(n), depth(n);
int T = 0, final_pos = -1;
// read a[], build depth[], find T=max(a)
for(int i = 0; i < n; i++){
cin >> a[i];
if(a[i] == -1){
depth[i] = -1; // mark final survivor
final_pos = i;
} else {
depth[i] = a[i];
T = max(T, a[i]);
}
}
// interpret depth=-1 as T+1
for(int i = 0; i < n; i++){
if(depth[i] < 0) depth[i] = T+1;
}
vector<int> alive(n), p(n);
iota(alive.begin(), alive.end(), 0);
int lval = 1, rval = n;
// peel off rounds 1..T
for(int d = 1; d <= T; d++){
vector<int> next_alive;
vector<vector<int>> blocks;
vector<int> cur;
// split alive into runs where depth==d (to remove)
// and survivors depth>d
for(int idx: alive){
if(depth[idx] == d){
cur.push_back(idx);
}
else { // depth[idx] > d
if(!cur.empty()){
blocks.push_back(cur);
cur.clear();
}
next_alive.push_back(idx);
}
}
if(!cur.empty())
blocks.push_back(cur);
// assign each block
if(d & 1){
// odd round: remove non‐minima → these must be LARGER than neighbours
// take from rval downward, but within each block assign in descending order
for(auto &blk: blocks){
for(int j = (int)blk.size()-1; j >= 0; --j){
p[ blk[j] ] = rval--;
}
}
} else {
// even round: remove non‐maxima → these must be SMALLER than neighbours
// take from lval upward, assign in ascending order
for(auto &blk: blocks){
for(int j = 0; j < (int)blk.size(); ++j){
p[ blk[j] ] = lval++;
}
}
}
alive.swap(next_alive);
}
// exactly one left
p[ alive[0] ] = lval; // lval == rval here
// output
for(int i = 0; i < n; i++){
cout << p[i] << (i+1<n?' ':'\n');
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgdDsgCiAgICBjaW4gPj4gdDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgdmVjdG9yPGludD4gYShuKSwgZGVwdGgobik7CiAgICAgICAgaW50IFQgPSAwLCBmaW5hbF9wb3MgPSAtMTsKCiAgICAgICAgLy8gcmVhZCBhW10sIGJ1aWxkIGRlcHRoW10sIGZpbmQgVD1tYXgoYSkKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgICAgIGlmKGFbaV0gPT0gLTEpewogICAgICAgICAgICAgICAgZGVwdGhbaV0gPSAtMTsgICAgICAgICAgIC8vIG1hcmsgZmluYWwgc3Vydml2b3IKICAgICAgICAgICAgICAgIGZpbmFsX3BvcyA9IGk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXB0aFtpXSA9IGFbaV07CiAgICAgICAgICAgICAgICBUID0gbWF4KFQsIGFbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGludGVycHJldCBkZXB0aD0tMSBhcyBUKzEKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICAgICAgaWYoZGVwdGhbaV0gPCAwKSBkZXB0aFtpXSA9IFQrMTsKICAgICAgICB9CgogICAgICAgIHZlY3RvcjxpbnQ+IGFsaXZlKG4pLCBwKG4pOwogICAgICAgIGlvdGEoYWxpdmUuYmVnaW4oKSwgYWxpdmUuZW5kKCksIDApOwoKICAgICAgICBpbnQgbHZhbCA9IDEsIHJ2YWwgPSBuOwogICAgICAgIC8vIHBlZWwgb2ZmIHJvdW5kcyAxLi5UCiAgICAgICAgZm9yKGludCBkID0gMTsgZCA8PSBUOyBkKyspewogICAgICAgICAgICB2ZWN0b3I8aW50PiBuZXh0X2FsaXZlOwogICAgICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGJsb2NrczsKICAgICAgICAgICAgdmVjdG9yPGludD4gY3VyOwoKICAgICAgICAgICAgLy8gc3BsaXQgYWxpdmUgaW50byBydW5zIHdoZXJlIGRlcHRoPT1kICh0byByZW1vdmUpIAogICAgICAgICAgICAvLyBhbmQgc3Vydml2b3JzIGRlcHRoPmQKICAgICAgICAgICAgZm9yKGludCBpZHg6IGFsaXZlKXsKICAgICAgICAgICAgICAgIGlmKGRlcHRoW2lkeF0gPT0gZCl7CiAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2hfYmFjayhpZHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7IC8vIGRlcHRoW2lkeF0gPiBkCiAgICAgICAgICAgICAgICAgICAgaWYoIWN1ci5lbXB0eSgpKXsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLnB1c2hfYmFjayhjdXIpOwogICAgICAgICAgICAgICAgICAgICAgICBjdXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dF9hbGl2ZS5wdXNoX2JhY2soaWR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZighY3VyLmVtcHR5KCkpCiAgICAgICAgICAgICAgICBibG9ja3MucHVzaF9iYWNrKGN1cik7CgogICAgICAgICAgICAvLyBhc3NpZ24gZWFjaCBibG9jawogICAgICAgICAgICBpZihkICYgMSl7CiAgICAgICAgICAgICAgICAvLyBvZGQgcm91bmQ6IHJlbW92ZSBub27igJBtaW5pbWEg4oaSIHRoZXNlIG11c3QgYmUgTEFSR0VSIHRoYW4gbmVpZ2hib3VycwogICAgICAgICAgICAgICAgLy8gdGFrZSBmcm9tIHJ2YWwgZG93bndhcmQsIGJ1dCB3aXRoaW4gZWFjaCBibG9jayBhc3NpZ24gaW4gZGVzY2VuZGluZyBvcmRlcgogICAgICAgICAgICAgICAgZm9yKGF1dG8gJmJsazogYmxvY2tzKXsKICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAoaW50KWJsay5zaXplKCktMTsgaiA+PSAwOyAtLWopewogICAgICAgICAgICAgICAgICAgICAgICBwWyBibGtbal0gXSA9IHJ2YWwtLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBldmVuIHJvdW5kOiByZW1vdmUgbm9u4oCQbWF4aW1hIOKGkiB0aGVzZSBtdXN0IGJlIFNNQUxMRVIgdGhhbiBuZWlnaGJvdXJzCiAgICAgICAgICAgICAgICAvLyB0YWtlIGZyb20gbHZhbCB1cHdhcmQsIGFzc2lnbiBpbiBhc2NlbmRpbmcgb3JkZXIKICAgICAgICAgICAgICAgIGZvcihhdXRvICZibGs6IGJsb2Nrcyl7CiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IChpbnQpYmxrLnNpemUoKTsgKytqKXsKICAgICAgICAgICAgICAgICAgICAgICAgcFsgYmxrW2pdIF0gPSBsdmFsKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBhbGl2ZS5zd2FwKG5leHRfYWxpdmUpOwogICAgICAgIH0KCiAgICAgICAgLy8gZXhhY3RseSBvbmUgbGVmdAogICAgICAgIHBbIGFsaXZlWzBdIF0gPSBsdmFsOyAgLy8gbHZhbCA9PSBydmFsIGhlcmUKCiAgICAgICAgLy8gb3V0cHV0CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgICAgIGNvdXQgPDwgcFtpXSA8PCAoaSsxPG4/JyAnOidcbicpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==