#include using namespace std; typedef __int128 LL; LL read() { long long x; scanf("%lld", &x); return x; } int n; LL m, a[100005]; struct node { LL ld, lp; node() {ld = lp = 0;} node(LL d, LL p) {ld = d, lp = p;} } s; node merge(node x, node y) { node res; if (y.ld >= x.lp) { res.ld = x.ld + y.ld - x.lp; res.lp = y.lp; } else { res.ld = x.ld; res.lp = x.lp + y.lp - y.ld; } return res; } node qpow(node x, LL y) { if (y == 0) return (node){0LL, 0LL}; node t = qpow(x, y >> 1); t = merge(t, t); if (y & 1) t = merge(x, t); return t; } int check(LL mid) { LL x = qpow(s, mid).lp; for (int i = 1; i <= n; i++) { x += a[i]; if (x < 0) x = 0; if (x >= m) return true; } return false; } void solve() { scanf("%d", &n); m = read(); s = (node){0LL, 0LL}; for (int i = 1; i <= n; i++) { a[i] = read(); if (a[i] > 0) s = merge(s, (node){0LL, a[i]}); else s = merge(s, (node){-a[i], 0LL}); } if (check(0)) { puts("1"); return ; } LL l = 0, r = 1E18, ans = -2; while (l <= r) { LL mid = (l + r) / 2; if (check(mid)) r = mid - 1, ans = mid; else l = mid + 1; } if (ans > 1E18) ans = -2; printf("%lld\n", (long long)ans + 1); } int main() { int t; scanf("%d", &t); while (t--) { solve(); } return 0; }