#include <bits/stdc++.h>
using namespace std;
long long rd() {
  long long rx = 0, fx = 1;
  char c = getchar();
  while (c < 48 || c > 57) {
    if (c == '-') fx = -1;
    c = getchar();
  }
  while (c >= 48 && c <= 57) {
    rx = rx * 10 + c - 48;
    c = getchar();
  }
  return rx * fx;
}
const long long N = 4e5 + 50, inf = (long long)1e18;
long long n, K, top, ans = 0, a[N], b[N], f[N], g[N], stk[N];
struct Segment_tree {
  long long hmi[N], gmi[N], tag[N];
  void mup(long long rt) {
    hmi[rt] = min(hmi[(rt << 1)], hmi[((rt << 1) | 1)]);
    gmi[rt] = min(gmi[(rt << 1)], gmi[((rt << 1) | 1)]);
  }
  void cov(long long rt, long long w) {
    tag[rt] += w;
    hmi[rt] += w;
  }
  void mdown(long long rt) {
    if (tag[rt]) {
      cov((rt << 1), tag[rt]);
      cov(((rt << 1) | 1), tag[rt]);
      tag[rt] = 0;
    }
  }
  void build(long long rt, long long l, long long r) {
    if (l == r) {
      hmi[rt] = g[l] + inf;
      gmi[rt] = g[l];
      return;
    }
    long long mid = (l + r) >> 1;
    build((rt << 1), l, mid);
    build(((rt << 1) | 1), mid + 1, r);
    mup(rt);
  }
  void add(long long rt, long long l, long long r, long long x, long long y,
           long long w) {
    if (l >= x && r <= y) {
      cov(rt, w);
      return;
    }
    long long mid = (l + r) >> 1;
    mdown(rt);
    if (mid >= x) add((rt << 1), l, mid, x, y, w);
    if (mid < y) add(((rt << 1) | 1), mid + 1, r, x, y, w);
    mup(rt);
  }
  long long query(long long rt, long long l, long long r, long long der,
                  long long vmi) {
    if (l == r) return l;
    long long mid = (l + r) >> 1;
    mdown(rt);
    if (min(vmi, hmi[(rt << 1)]) >= gmi[((rt << 1) | 1)] - der)
      return query(((rt << 1) | 1), mid + 1, r, der, min(vmi, hmi[(rt << 1)]));
    else
      return query((rt << 1), l, mid, der, vmi);
  }
  long long query(long long rt, long long l, long long r, long long pos,
                  long long der, long long vmi) {
    if (r <= pos) {
      if (vmi >= gmi[rt] - der)
        return query(rt, l, r, der, vmi);
      else
        return -1;
    }
    long long mid = (l + r) >> 1, ret = -1;
    mdown(rt);
    if (mid < pos)
      ret = query(((rt << 1) | 1), mid + 1, r, pos, der,
                  min(vmi, hmi[(rt << 1)]));
    if (ret == -1) ret = query((rt << 1), l, mid, pos, der, vmi);
    return ret;
  }
} sgt;
int main() {
  long long i, x, sl, sr, mid, pos, all, der, R;
  n = rd();
  K = rd();
  for (i = 1; i < n; i++) b[i] = rd();
  for (i = 1; i <= n; i++) a[i] = rd();
  f[1] = 0;
  for (i = 2; i <= n; i++) f[i] = f[i - 1] + a[i - 1] - b[i - 1];
  g[n] = 0;
  for (i = n - 1; i >= 1; i--) g[i] = g[i + 1] + a[i + 1] - b[i];
  sgt.build(1, 1, n);
  top = 0;
  for (i = n; i >= 1; i--) {
    sgt.add(1, 1, n, i, i, -inf);
    while (top > 0 && f[stk[top]] >= f[i]) {
      x = stk[top];
      top--;
      if (top > 0 && stk[top] >= 3)
        sgt.add(1, 1, n, 1, stk[top] - 2, f[stk[top]] - f[x]);
    }
    if (top > 0 && stk[top] >= 3)
      sgt.add(1, 1, n, 1, stk[top] - 2, f[i] - f[stk[top]]);
    stk[++top] = i;
    if (f[i] - f[stk[1]] <= K)
      pos = n;
    else {
      sl = 1;
      sr = top;
      while (sl < sr) {
        mid = (sl + sr + 1) >> 1;
        if (f[i] - f[stk[mid]] > K)
          sl = mid;
        else
          sr = mid - 1;
      }
      pos = stk[sl];
    }
    all = f[i] - f[stk[1]];
    der = K - all;
    R = sgt.query(1, 1, n, pos, der, inf);
    ans = max(ans, R - i + 1);
  }
  printf("%lld\n", ans);
  return 0;
}
