#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
void solve() {
int n;
cin >> n;
// Khởi tạo mảng kích thước n + 1 để sử dụng index từ 1 đến n
vector<long long> a(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
// Mảng S lưu tổng hậu tố, kích thước n + 1
vector<long long> S(n + 1, 0);
// S_n = 0 theo đúng công thức phân tích
S[n] = 0;
// Tính tổng hậu tố S_i = a_i + a_{i+1} + ... + a_{n-1}
for (int i = n - 1; i >= 1; --i) {
S[i] = S[i + 1] + a[i];
}
// Lưu trữ các cặp {Giá trị tổng hậu tố, Vị trí ban đầu}
vector<pair<long long, int>> S_vals(n + 1);
for (int i = 1; i <= n; ++i) {
S_vals[i] = {S[i], i};
}
// Sắp xếp các giá trị từ index 1 đến n tăng dần
sort(S_vals.begin() + 1, S_vals.end());
// Khôi phục hoán vị p kích thước n + 1
vector<int> p(n + 1);
for (int i = 1; i <= n; ++i) {
// Gán giá trị i cho phần tử có tổng hậu tố nhỏ thứ i
p[S_vals[i].second] = i;
}
// In kết quả từ phần tử 1 đến n
for (int i = 1; i <= n; ++i) {
cout << p[i] << (i == n ? "" : " ");
}
cout << "\n";
}
int main() {
// Tối ưu hóa I/O cho luồng dữ liệu lớn
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
if (cin >> t) {
while (t--) {
solve();
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIHNvbHZlKCkgewogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIAogICAgLy8gS2jhu59pIHThuqFvIG3huqNuZyBrw61jaCB0aMaw4bubYyBuICsgMSDEkeG7gyBz4butIGThu6VuZyBpbmRleCB04burIDEgxJHhur9uIG4KICAgIHZlY3Rvcjxsb25nIGxvbmc+IGEobiArIDEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICB9CiAgICAKICAgIC8vIE3huqNuZyBTIGzGsHUgdOG7lW5nIGjhuq11IHThu5EsIGvDrWNoIHRoxrDhu5tjIG4gKyAxCiAgICB2ZWN0b3I8bG9uZyBsb25nPiBTKG4gKyAxLCAwKTsKICAgIAogICAgLy8gU19uID0gMCB0aGVvIMSRw7puZyBjw7RuZyB0aOG7qWMgcGjDom4gdMOtY2gKICAgIFNbbl0gPSAwOwogICAgCiAgICAvLyBUw61uaCB04buVbmcgaOG6rXUgdOG7kSBTX2kgPSBhX2kgKyBhX3tpKzF9ICsgLi4uICsgYV97bi0xfQogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDE7IC0taSkgewogICAgICAgIFNbaV0gPSBTW2kgKyAxXSArIGFbaV07CiAgICB9CiAgICAKICAgIC8vIEzGsHUgdHLhu68gY8OhYyBj4bq3cCB7R2nDoSB0cuG7iyB04buVbmcgaOG6rXUgdOG7kSwgVuG7iyB0csOtIGJhbiDEkeG6p3V9CiAgICB2ZWN0b3I8cGFpcjxsb25nIGxvbmcsIGludD4+IFNfdmFscyhuICsgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBTX3ZhbHNbaV0gPSB7U1tpXSwgaX07CiAgICB9CiAgICAKICAgIC8vIFPhuq9wIHjhur9wIGPDoWMgZ2nDoSB0cuG7iyB04burIGluZGV4IDEgxJHhur9uIG4gdMSDbmcgZOG6p24KICAgIHNvcnQoU192YWxzLmJlZ2luKCkgKyAxLCBTX3ZhbHMuZW5kKCkpOwogICAgCiAgICAvLyBLaMO0aSBwaOG7pWMgaG/DoW4gduG7iyBwIGvDrWNoIHRoxrDhu5tjIG4gKyAxCiAgICB2ZWN0b3I8aW50PiBwKG4gKyAxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgIC8vIEfDoW4gZ2nDoSB0cuG7iyBpIGNobyBwaOG6p24gdOG7rSBjw7MgdOG7lW5nIGjhuq11IHThu5Egbmjhu48gdGjhu6kgaQogICAgICAgIHBbU192YWxzW2ldLnNlY29uZF0gPSBpOyAKICAgIH0KICAgIAogICAgLy8gSW4ga+G6v3QgcXXhuqMgdOG7qyBwaOG6p24gdOG7rSAxIMSR4bq/biBuCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBjb3V0IDw8IHBbaV0gPDwgKGkgPT0gbiA/ICIiIDogIiAiKTsKICAgIH0KICAgIGNvdXQgPDwgIlxuIjsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBU4buRaSDGsHUgaMOzYSBJL08gY2hvIGx14buTbmcgZOG7ryBsaeG7h3UgbOG7m24KICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKICAgIAogICAgaW50IHQ7CiAgICBpZiAoY2luID4+IHQpIHsKICAgICAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgICAgIHNvbHZlKCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=