#include <bits/stdc++.h>
using namespace std;
long long suml[100005], sumr[100005];
namespace SGT {
long long addv[400000], minsum[400000];
long long minn[400000], maxd[400000];
inline void pushdown(int o) {
  if (addv[o]) {
    addv[o * 2] += addv[o];
    minn[o * 2] += addv[o];
    maxd[o * 2] += addv[o];
    addv[o * 2 + 1] += addv[o];
    minn[o * 2 + 1] += addv[o];
    maxd[o * 2 + 1] += addv[o];
    addv[o] = 0;
  }
}
long long dfs(int l, int r, int o, long long p) {
  if (l == r)
    return p - sumr[l];
  else {
    pushdown(o);
    int m = ((l + r) >> 1);
    if (p >= minn[o * 2])
      return max(dfs(l, m, o * 2, p), maxd[o]);
    else
      return max(p - minsum[o * 2], dfs(m + 1, r, o * 2 + 1, p));
  }
}
inline void pushup(int l, int r, int o) {
  int m = ((l + r) >> 1);
  minsum[o] = min(minsum[o * 2], minsum[o * 2 + 1]);
  minn[o] = min(minn[o * 2], minn[o * 2 + 1]);
  maxd[o] = dfs(m + 1, r, o * 2 + 1, minn[o * 2]);
}
void build(int l, int r, int o) {
  minn[o] = 0x3f3f3f3f3f3f3f3fLL;
  if (l == r)
    minsum[o] = sumr[l];
  else {
    int m = ((l + r) >> 1);
    build(l, m, o * 2);
    build(m + 1, r, o * 2 + 1);
    minsum[o] = min(minsum[o * 2], minsum[o * 2 + 1]);
    maxd[o] = minn[o] - minsum[o * 2 + 1];
  }
}
void update(int l, int r, int o, int lx, int rx, long long p) {
  if (l >= lx && r <= rx) {
    addv[o] += p;
    minn[o] += p;
    maxd[o] += p;
  } else {
    pushdown(o);
    int m = ((l + r) >> 1);
    if (m >= lx) update(l, m, o * 2, lx, rx, p);
    if (m < rx) update(m + 1, r, o * 2 + 1, lx, rx, p);
    pushup(l, r, o);
  }
}
int query2(int l, int r, int o, long long p) {
  if (l == r)
    return (p >= sumr[l]) ? l : -1;
  else {
    pushdown(o);
    int m = ((l + r) >> 1);
    if (p >= minsum[o * 2 + 1])
      return query2(m + 1, r, o * 2 + 1, p);
    else
      return query2(l, m, o * 2, p);
  }
}
int query1(int l, int r, int o, long long p) {
  if (l == r)
    return (p >= sumr[l]) ? l : -1;
  else {
    pushdown(o);
    int m = ((l + r) >> 1);
    if (p >= minn[o * 2])
      return (maxd[o] >= 0) ? query1(m + 1, r, o * 2 + 1, minn[o * 2])
                            : query1(l, m, o * 2, p);
    else {
      int t = query1(m + 1, r, o * 2 + 1, p);
      if (t != -1) return t;
      return query2(l, m, o * 2, p);
    }
  }
}
}  // namespace SGT
int st[100005];
int a[100005], b[100005];
long long d[100005];
int posr[100005];
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
  for (int i = 1; i < n; i++) suml[i] = suml[i - 1] + a[i] - b[i];
  suml[n] = -0x3f3f3f3f3f3f3f3fLL;
  for (int i = 1; i <= n; i++) d[i] = max(suml[i], suml[i - 1]);
  for (int i = 2; i <= n; i++) sumr[i] = sumr[i - 1] + a[i - 1] - b[i];
  int top = 0;
  for (int i = n; i > 0; i--) {
    while (top && suml[st[top] - 1] <= suml[i - 1]) top--;
    st[++top] = i;
    if (top && suml[st[1] - 1] - suml[i - 1] > k) {
      int l = 1, r = top;
      while (l < r) {
        int m = ((l + r) >> 1) + 1;
        if (suml[st[m] - 1] - suml[i - 1] > k)
          l = m;
        else
          r = m - 1;
      }
      posr[i] = st[l];
    }
  }
  SGT::build(1, n, 1);
  int ans = 0;
  top = 0;
  st[0] = n + 1;
  int nr = n;
  for (int i = n; i > 0; i--) {
    while (top && k - d[st[top]] >= k - d[i]) {
      SGT::update(1, n, 1, st[top], st[top - 1] - 1, d[st[top]] - d[i]);
      top--;
    }
    st[++top] = i;
    if (i < n) SGT::update(1, n, 1, i + 1, n, suml[i - 1] - suml[i]);
    SGT::update(1, n, 1, i, i,
                sumr[i] + k - d[i] + suml[i - 1] - 0x3f3f3f3f3f3f3f3fLL);
    if (posr[i])
      SGT::update(1, n, 1, max(1, posr[i] - 1), n, -0x3f3f3f3f3f3f3f3fLL);
    int t = SGT::query1(1, n, 1, 0x3f3f3f3f3f3f3f3fLL);
    if (posr[i])
      SGT::update(1, n, 1, max(1, posr[i] - 1), n, 0x3f3f3f3f3f3f3f3fLL);
    ans = max(ans, t - i + 1);
  }
  printf("%d\n", ans);
  return 0;
}
