#include <bits/stdc++.h>
using namespace std;
const long long inf = 1ll << 60;
int n, k, s[200005], top, ans;
long long a[200005], b[200005], c[200005], d[200005];
struct sgt {
  long long d, d1, tg;
  sgt() { d1 = -inf; }
} t[200005 << 2];
inline int read() {
  int s = 0, f = 0;
  char ch = getchar();
  while (ch < 48 || ch > 57) f = (ch == '-'), ch = getchar();
  while (ch > 47 && ch < 58)
    s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
  return f ? -s : s;
}
void Tag(int p, long long x) { t[p].d1 += x, t[p].tg += x; }
void Pushdown(int p) {
  if (t[p].tg) Tag(p << 1, t[p].tg), Tag(p << 1 | 1, t[p].tg), t[p].tg = 0;
}
void Pushup(int p) {
  t[p].d = max(t[p << 1].d, t[p << 1 | 1].d),
  t[p].d1 = max(t[p << 1].d1, t[p << 1 | 1].d1);
}
void Add(int p, int l, int r, int cl, int cr, long long x) {
  if (cl <= l && r <= cr) return Tag(p, x);
  int mid = (l + r) >> 1;
  Pushdown(p);
  if (cl <= mid) Add(p << 1, l, mid, cl, cr, x);
  if (cr > mid) Add(p << 1 | 1, mid + 1, r, cl, cr, x);
  Pushup(p);
}
void Change(int p, int l, int r, int x, long long y) {
  if (l == r) return t[p].d = t[p].d1 = y, void();
  int mid = (l + r) >> 1;
  Pushdown(p);
  if (x <= mid)
    Change(p << 1, l, mid, x, y);
  else
    Change(p << 1 | 1, mid + 1, r, x, y);
  Pushup(p);
}
int tmp[200005], L[200005], R[200005], cnt;
long long qz[200005];
void Ask(int p, int l, int r, int ql, int qr) {
  if (ql <= l && r <= qr) return tmp[++cnt] = p, L[cnt] = l, R[cnt] = r, void();
  int mid = (l + r) >> 1;
  Pushdown(p);
  if (ql <= mid) Ask(p << 1, l, mid, ql, qr);
  if (qr > mid) Ask(p << 1 | 1, mid + 1, r, ql, qr);
}
int Query(int p, int l, int r, long long x) {
  if (l == r) return l;
  int mid = (l + r) >> 1;
  Pushdown(p);
  if (t[p << 1 | 1].d + k < max(x, t[p << 1].d1))
    return Query(p << 1, l, mid, x);
  return Query(p << 1 | 1, mid + 1, r, max(x, t[p << 1].d1));
}
int Get(int l, int r) {
  qz[cnt = 0] = -inf, Ask(1, 1, n, l, r);
  for (int i = 1; i <= cnt; ++i) qz[i] = max(qz[i - 1], t[tmp[i]].d1);
  for (int i = cnt; i; --i)
    if (t[tmp[i]].d + k >= qz[i - 1])
      return Query(tmp[i], L[i], R[i], qz[i - 1]);
}
int main() {
  n = read(), k = read();
  for (int i = 1; i < n; ++i) a[i] = a[i - 1] + read();
  for (int i = 1; i <= n; ++i) b[i] = b[i - 1] + read();
  for (int i = 1; i <= n; ++i) c[i] = a[i - 1] - b[i - 1];
  for (int i = 1; i <= n; ++i) d[i] = b[i] - a[i - 1];
  for (int i = n, l, r, mid, wer; i; --i) {
    while (top && c[s[top]] <= c[i]) {
      if (top > 1) Add(1, 1, n, s[top - 1] - 1, n, c[s[top]] - c[s[top - 1]]);
      --top;
    }
    Change(1, 1, n, s[++top] = i, d[i]);
    if (top > 1) Add(1, 1, n, s[top - 1] - 1, n, c[s[top - 1]] - c[i]);
    for (l = 1, r = top; l <= r;)
      if (c[s[mid = (l + r) >> 1]] - c[i] <= k)
        r = (wer = mid) - 1;
      else
        l = mid + 1;
    ans = max(ans, Get(i, (wer == 1) ? n : s[wer - 1] - 1) - i + 1);
  }
  cout << ans << "\n";
  return 0;
}
