← Home
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long
#define ui unsigned long long
#define fast() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define ld long double
#define pb push_back
#define SZ(a) (ll)(a.size())
#define FOR(i,a,n) for(ll i=a;i<=n;i++)
#define FORr(i,a,n) for(ll i=n;i>=a;i--)
#define trav(m,a) for(auto m:a){cout<<m<<" ";}cout<<"\n";
#define travP(m,a) for(auto m:a){cout<<m.first<<" "<<m.second<<"\n";}cout<<"\n";
#define read(a,n) FOR(i,1,n){ll q;cin>>q;a.pb(q);}
#define vi vector<int>
#define vll vector<ll>
#define F first
#define S second
#define pie 3.141592654
#define MAX 9000000000000000000
#define MIN -9000000000000000000
#define print(a) cout<<a<<"\n"
template<class T>using oset=tree<T,null_type,less_equal<T>,rb_tree_tag,tree_order_statistics_node_update>;//multiset-less_equal
bool cmp(const pair<ll,ll>&a,const pair<ll,ll>&b){
    if(a.S==b.S){return a.F<b.F;}
    return a.S<b.S;
}
const int N = 2e5 + 5;
const int LOG = 20;
ll st[N][LOG];
ll L[N];
int lg[N];
void build_log(int n) {
    lg[1] = 0;
    for (int i = 2; i <= n; i++) {
        lg[i] = lg[i / 2] + 1;
    }
}
void build_sparse(int n) {
    for (int i = 1; i <= n; i++) {
        st[i][0] = L[i];
    }
    for (int j = 1; j < LOG; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++) {
            st[i][j] = min(st[i][j-1], st[i + (1 << (j-1))][j-1]);
        }
    }
}
ll query(int L, int R) {
    int j = lg[R - L + 1];
    return min(st[L][j], st[R - (1 << j) + 1][j]);
}
ll st1[N][LOG];
ll R[N];
void build_sparse1(int n) {
    for (int i = 1; i <= n; i++) {
        st1[i][0] = R[i];
    }
    for (int j = 1; j < LOG; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++) {
            st1[i][j] = max(st1[i][j-1], st1[i + (1 << (j-1))][j-1]);
        }
    }
}
ll query1(int L, int R) {
    int j = lg[R - L + 1];
    return max(st1[L][j], st1[R - (1 << j) + 1][j]);
}
//Lazy segment tree for assignment and sum
class SegmentTree{
private:
    vector<ll>tr,lazy,marked;
    ll n;
 
    void build(vector<ll> &arr, int node, int b, int e){
        if(b == e){
            tr[node] = arr[b];
        }
        else{
            int mid = (b + e) / 2;
            build(arr, 2*node, b, mid);
            build(arr, (2*node)+1, mid+1, e);
            tr[node] =  tr[2*node] + tr[(2*node)+1];
        }
    }
    void push(int node,int b,int e){
        if(marked[node] && b!=e){
            int Left = node * 2;
            int Right = (node * 2) + 1;
            int mid = (b + e) / 2;
            lazy[Left] = lazy[Right] = lazy[node];
            tr[Left] = (mid-b+1) * lazy[Left];
            tr[Right] = (e-(mid+1)+1) * lazy[Right];
            marked[Left] = marked[Right] = true;
            marked[node] = false;
        }
    }
    void update(int node, int b, int e, int l, int r, ll x){
        if(l > e || r < b){
            return;
        }
        if(l <= b && e <= r){
            tr[node] = (e-b+1) * x;
            lazy[node] = x;
            marked[node] = true;
            return;
        }
        push(node, b, e);
        int Left = node * 2;
        int Right = (node * 2) + 1;
        int mid = (b + e) / 2;
        update(Left, b, mid, l, r, x);
        update(Right, mid + 1, e, l, r, x);
        tr[node] = tr[Left] + tr[Right];
    }
    ll query(int node, int b, int e, int l, int r){
        if (l > e || r < b){
            return 0ll;
        }
        if (b >= l and e <= r){
            return tr[node];
        }
        push(node, b, e);
        int Left = node << 1;
        int Right = (node << 1) + 1;
        int mid = (b + e) >> 1;
 
        ll p1 = query(Left, b, mid, l, r);
        ll p2 = query(Right, mid + 1, e, l, r);
 
        return (ll)(p1 + p2);
    }
public:
    SegmentTree(vector<ll> &arr){
        n = (int)arr.size() - 1;
        tr.resize(4 * n, 0ll);
        lazy.resize(4 * n, 0ll);
        marked.resize(4 * n, 0ll);
        build(arr, 1, 1, n);
    }
    void upd(int l,int r,ll val){
        update(1, 1, n, l, r, val);
    }
    ll qr(int l,int r){
        return query(1, 1, n, l, r);
    }
};
int main(){
    fast();
    int T;cin>>T;
    while(T--){
        int n,x;cin>>n>>x;vector<ll>a(n+1),pref(n+1);
        vector<vector<int>>store(n+2);
        FOR(i,1,n){
            cin>>a[i];pref[i]=a[i]+pref[i-1];
        }
        for(int i=1;i<=n;i++){
            int l=i+1,r=n,res=n+1;
            while(l<=r){
                int mid=(l+r)/2;
                if(pref[mid]-pref[i]>=a[i]){
                    res=mid;r=mid-1;
                }
                else{l=mid+1;}
            }
            R[i]=res;store[res].pb(i);
            l=1;r=i-1;res=0;
            while(l<=r){
                int mid=(l+r)/2;
                if(pref[i-1]-pref[mid-1]>=a[i]){
                    res=mid;l=mid+1;
                }
                else{r=mid-1;}
            }
            L[i]=res;
        }
        build_log(n);
        build_sparse(n);
        build_sparse1(n);
        vector<ll>cnt(n+1);
        SegmentTree seg(cnt);
        vector<int>ans(n+1);
        for(int i=1;i<=n;i++){
            for(auto M:store[i]){
                int l=M+1,r=i,res=-1;
                while(l<=r){
                    int mid=(l+r)/2;
                    int mn=query(mid, i);
                    if(mn<=M){
                        res=mid;l=mid+1;
                    }
                    else{r=mid-1;}
                }
                if(res!=-1 && M+1<=res-1){
                    seg.upd(M+1, res-1, 1);
                }
            }
            if(i>1 && !L[i]){
                seg.upd(1, i-1, 1);
            }
            ll l=1,r=i-1,res=-1;
            while(l<=r){
                int mid=(l+r)/2;
                int mx=query1(1, mid);
                if(mx>i){res=mid;r=mid-1;}
                else{l=mid+1;}
            }
            if(res==-1){res=i;}
            ans[i]=res-seg.qr(1, res);
        }
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}