#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
public:
vector <int> tree;
SegmentTree(int n) {
tree.resize(4 * n + 1, 0);
}
// call these methods
int Query(int n, int i, int j) {
return Query(1, 0, n - 1, i, j);
}
void Update(int n, int pos, int val) {
Update(1, 0, n - 1, pos, val);
}
private:
void Update(int node, int b, int e, int pos, int val) {
if (b > e || pos > e || pos < b) {
return;
}
if (b == e && b == pos) {
tree[node] = val;
return;
}
int l = node << 1, r = l | 1, m = (b + e) >> 1;
if (pos <= m) {
Update(l, b, m, pos, val);
} else {
Update(r, m + 1, e, pos, val);
}
tree[node] = tree[l] + tree[r];
}
int Query(int node, int b, int e, int i, int j) {
if (b > e || i > e || j < b) {
return 0;
}
if (i <= b && j >= e) {
return tree[node];
}
int l = node << 1, r = l | 1, m = (b + e) >> 1;
return Query(l, b, m, i, j) + Query(r, m + 1, e, i, j);
}
};
class Solution {
public:
vector<int> canSeePersonsCount(vector<int>& heights) {
int n = heights.size();
stack <int> st;
// for each i, range[i] = right most index after which ith person can't see
vector <int> range(n, 0);
for (int i = n - 1; i >= 0; i--) {
while (!st.empty() && heights[st.top()] <= heights[i]) st.pop();
if (st.empty()) {
range[i] = n - 1;
} else {
range[i] = st.top();
}
st.push(i);
}
st = stack <int> ();
vector <int> ans(heights.size(), 0);
SegmentTree *tree = new SegmentTree(heights.size());
for (int i = 0; i < heights.size(); i++) {
tree -> Update(n, i, 1);
}
for (int i = n - 1; i >= 0; i--) {
ans[i] = tree -> Query(n, i + 1, range[i]);
// eliminate the shorter persons in the range who will be blocked by this person
while (!st.empty() && heights[st.top()] <= heights[i]) {
tree -> Update(n, st.top(), 0);
st.pop();
}
st.push(i);
}
return ans;
}
} s;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector <int> v;
for (int i = 1; i <= n; i++) {
int val;
cin >> val;
v.push_back(val);
}
vector <int> ans = s.canSeePersonsCount(v);
for (auto val: ans) cout << val << " ";
cout << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTZWdtZW50VHJlZSB7CnB1YmxpYzoKICAgIHZlY3RvciA8aW50PiB0cmVlOwogICAgCiAgICBTZWdtZW50VHJlZShpbnQgbikgewogICAgICAgIHRyZWUucmVzaXplKDQgKiBuICsgMSwgMCk7CiAgICB9CiAgICAKICAgIC8vIGNhbGwgdGhlc2UgbWV0aG9kcwogICAgaW50IFF1ZXJ5KGludCBuLCBpbnQgaSwgaW50IGopIHsKICAgICAgICByZXR1cm4gUXVlcnkoMSwgMCwgbiAtIDEsIGksIGopOwogICAgfQoKICAgIHZvaWQgVXBkYXRlKGludCBuLCBpbnQgcG9zLCBpbnQgdmFsKSB7CiAgICAgICAgVXBkYXRlKDEsIDAsIG4gLSAxLCBwb3MsIHZhbCk7CiAgICB9CiAgICAKcHJpdmF0ZToKICAgIHZvaWQgVXBkYXRlKGludCBub2RlLCBpbnQgYiwgaW50IGUsIGludCBwb3MsIGludCB2YWwpIHsKICAgICAgICBpZiAoYiA+IGUgfHwgcG9zID4gZSB8fCBwb3MgPCBiKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChiID09IGUgJiYgYiA9PSBwb3MpIHsKICAgICAgICAgICAgdHJlZVtub2RlXSA9IHZhbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaW50IGwgPSBub2RlIDw8IDEsIHIgPSBsIHwgMSwgbSA9IChiICsgZSkgPj4gMTsKCiAgICAgICAgaWYgKHBvcyA8PSBtKSB7CiAgICAgICAgICAgIFVwZGF0ZShsLCBiLCBtLCBwb3MsIHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKHIsIG0gKyAxLCBlLCBwb3MsIHZhbCk7CiAgICAgICAgfQoKICAgICAgICB0cmVlW25vZGVdID0gdHJlZVtsXSArIHRyZWVbcl07CiAgICB9CgogICAgaW50IFF1ZXJ5KGludCBub2RlLCBpbnQgYiwgaW50IGUsIGludCBpLCBpbnQgaikgewogICAgICAgIGlmIChiID4gZSB8fCBpID4gZSB8fCBqIDwgYikgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGlmIChpIDw9IGIgJiYgaiA+PSBlKSB7CiAgICAgICAgICAgIHJldHVybiB0cmVlW25vZGVdOwogICAgICAgIH0KCiAgICAgICAgaW50IGwgPSBub2RlIDw8IDEsIHIgPSBsIHwgMSwgbSA9IChiICsgZSkgPj4gMTsKCiAgICAgICAgcmV0dXJuIFF1ZXJ5KGwsIGIsIG0sIGksIGopICsgUXVlcnkociwgbSArIDEsIGUsIGksIGopOwogICAgfQp9OwoKY2xhc3MgU29sdXRpb24gewpwdWJsaWM6CiAgICB2ZWN0b3I8aW50PiBjYW5TZWVQZXJzb25zQ291bnQodmVjdG9yPGludD4mIGhlaWdodHMpIHsKICAgICAgICBpbnQgbiA9IGhlaWdodHMuc2l6ZSgpOwogICAgICAgIHN0YWNrIDxpbnQ+IHN0OwogICAgICAgIC8vIGZvciBlYWNoIGksIHJhbmdlW2ldID0gcmlnaHQgbW9zdCBpbmRleCBhZnRlciB3aGljaCBpdGggcGVyc29uIGNhbid0IHNlZQogICAgICAgIHZlY3RvciA8aW50PiByYW5nZShuLCAwKTsKICAgICAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHdoaWxlICghc3QuZW1wdHkoKSAmJiBoZWlnaHRzW3N0LnRvcCgpXSA8PSBoZWlnaHRzW2ldKSBzdC5wb3AoKTsKICAgICAgICAgICAgaWYgKHN0LmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJhbmdlW2ldID0gbiAtIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByYW5nZVtpXSA9IHN0LnRvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0LnB1c2goaSk7CiAgICAgICAgfQoKICAgICAgICBzdCA9IHN0YWNrIDxpbnQ+ICgpOwogICAgICAgIHZlY3RvciA8aW50PiBhbnMoaGVpZ2h0cy5zaXplKCksIDApOwoKICAgICAgICBTZWdtZW50VHJlZSAqdHJlZSA9IG5ldyBTZWdtZW50VHJlZShoZWlnaHRzLnNpemUoKSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIHRyZWUgLT4gVXBkYXRlKG4sIGksIDEpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBhbnNbaV0gPSB0cmVlIC0+IFF1ZXJ5KG4sIGkgKyAxLCByYW5nZVtpXSk7CgogICAgICAgICAgICAvLyBlbGltaW5hdGUgdGhlIHNob3J0ZXIgcGVyc29ucyBpbiB0aGUgcmFuZ2Ugd2hvIHdpbGwgYmUgYmxvY2tlZCBieSB0aGlzIHBlcnNvbgogICAgICAgICAgICB3aGlsZSAoIXN0LmVtcHR5KCkgJiYgaGVpZ2h0c1tzdC50b3AoKV0gPD0gaGVpZ2h0c1tpXSkgewogICAgICAgICAgICAgICAgdHJlZSAtPiBVcGRhdGUobiwgc3QudG9wKCksIDApOwogICAgICAgICAgICAgICAgc3QucG9wKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0LnB1c2goaSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9IHM7CgppbnQgbWFpbigpIHsKCWludCB0OwoJY2luID4+IHQ7Cgl3aGlsZSAodC0tKSB7CgkJaW50IG47CgkJY2luID4+IG47CgkJdmVjdG9yIDxpbnQ+IHY7CgkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJCWludCB2YWw7CgkJCWNpbiA+PiB2YWw7CgkJCXYucHVzaF9iYWNrKHZhbCk7CgkJfQoJCQoJCXZlY3RvciA8aW50PiBhbnMgPSBzLmNhblNlZVBlcnNvbnNDb3VudCh2KTsKCQlmb3IgKGF1dG8gdmFsOiBhbnMpIGNvdXQgPDwgdmFsIDw8ICIgIjsKCQljb3V0IDw8ICJcbiI7Cgl9CglyZXR1cm4gMDsKfQoK