#include<bits/stdc++.h>
#define int long long
#define db double
#define inf 2e18
#define mp make_pair
#define fi first
#define se second
#define pr printf
#define ps puts
#define pb push_back
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int N=2e5+10;
typedef pair<int,int> PII;
int n,m,a[N],b[N],c[N],tr[N];
PII d[N];
int vis[N];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int lowbit(int x){return x&(-x);}
void update(int x,int y){for(;x<=n;x+=lowbit(x)) tr[x]+=y;}
int query(int x){int res=0;for(;x;x-=lowbit(x)) res+=tr[x];return res;}
void solve(){
int i,j,x,l,r,mid,ans=0;
For(i,1,n) b[i]=a[i]+i,c[i]=a[i]+n+1-i;
For(i,1,(n-1)/2+1) d[i]=mp(b[i],i);
For(i,(n-1)/2+2,n) d[i]=mp(c[i],i);
sort(d+1,d+1+n);
For(i,1,n) vis[d[i].se]=i;
For(i,1,n) update(i,d[i].fi);
For(i,1,n){
x=d[vis[i]].fi;
if(b[i]>m) continue;
update(vis[i],-x);
l=1,r=n;
while(r-l>=10){
mid=l+r>>1;
if(query(mid)>=m-b[i]) r=mid-1;
else l=mid+1;
}
For(mid,l,r) if(query(mid)>m-b[i]) break;
mid--;
if(mid<vis[i]) mid++;
ans=max(ans,mid);
update(vis[i],x);
}
pr("%lld\n",ans);
For(i,1,n) tr[i]=0;
For(i,1,n) vis[i]=0;
}
signed main(){
int t,i,j;
t=read();
while(t--){
n=read(),m=read();
For(i,1,n) a[i]=read();
solve();
}
return 0;
}