#include <bits/stdc++.h>
const int TT = 100000 * 22 + 50;
char input_buffer[TT], output_buffer[TT];
char *input_pos = input_buffer, *output_pos = output_buffer;
inline int getint() {
  int x = 0, p = 1;
  char c = (*input_pos++);
  while (c <= 32) c = (*input_pos++);
  if (c == 45) p = -p, c = (*input_pos++);
  while (c > 32) x = x * 10 + c - 48, c = (*input_pos++);
  return x * p;
}
inline void write(int x) {
  if (!x) return;
  write(x / 10);
  (*output_pos++) = x % 10 + '0';
}
using namespace std;
const int N = 1e6 + 5;
const long long inf = 2e18;
int n, k, w[N], d[N], res[N];
long long a[N], b[N], dat[N << 2], tag[N << 2], mn[N << 2];
vector<int> st;
inline void add(int k, long long x) {
  dat[k] += x;
  tag[k] += x;
}
inline void pd(int k) {
  if (tag[k]) {
    add(2 * k + 1, tag[k]);
    add(2 * k + 2, tag[k]);
    tag[k] = 0;
  }
}
void upd(int l, int r, int k, int p) {
  if (r - l == 1) {
    mn[k] = dat[k] = b[p];
    return;
  }
  int mid = (l + r) >> 1;
  if (p < mid)
    upd(l, mid, 2 * k + 1, p);
  else
    upd(mid, r, 2 * k + 2, p);
  dat[k] = min(dat[2 * k + 1], dat[2 * k + 2]);
  mn[k] = min(mn[2 * k + 1], mn[2 * k + 2]);
}
void modify(int l, int r, int x, int y, int k, long long v) {
  if (l >= y || x >= r) return;
  if (x <= l && r <= y) {
    add(k, v);
    return;
  }
  pd(k);
  int mid = (l + r) >> 1;
  modify(l, mid, x, y, 2 * k + 1, v);
  modify(mid, r, x, y, 2 * k + 2, v);
  dat[k] = min(dat[2 * k + 1], dat[2 * k + 2]);
}
int qry(int l, int r, int p, int id, long long x) {
  if (r - l == 1) return l;
  pd(id);
  int mid = (l + r) >> 1;
  long long to = min(x, dat[2 * id + 1]);
  if (mid <= p && to >= mn[2 * id + 2] - k) {
    int ans = qry(mid, r, p, 2 * id + 2, to);
    if (ans >= 0) return ans;
  }
  if (mn[2 * id + 1] - k <= x) return qry(l, mid, p, 2 * id + 1, x);
  return -1;
}
int main() {
  for (int(i) = 0; (i) < (N << 2); (i)++) mn[i] = -inf, dat[i] = inf;
  fread(input_buffer, 1, TT, stdin);
  n = getint();
  k = getint();
  for (int(i) = 0; (i) < (n - 1); (i)++) d[i] = getint();
  for (int(i) = 0; (i) < (n); (i)++) w[i] = getint();
  for (int i = 1; i < n; i++) a[i] = a[i - 1] + w[i - 1] - d[i - 1];
  b[0] = -w[0];
  for (int i = 1; i < n; i++) b[i] = b[i - 1] - w[i] + d[i - 1];
  st.emplace_back(n);
  a[n] = -inf;
  int ans = 0;
  for (int i = n - 1; i >= 0; i--) {
    upd(0, n, 0, i);
    while (st.size() && a[st.back()] >= a[i]) {
      if (st.size() > 2)
        modify(0, n, st[st.size() - 2] - 1, n, 0,
               a[st.back()] - a[st[st.size() - 2]]);
      st.pop_back();
    }
    int lb = 0, rb = st.size();
    while (rb - lb > 1) {
      int mid = (lb + rb) >> 1;
      if (a[st[mid]] + k < a[i])
        lb = mid;
      else
        rb = mid;
    }
    if (st.size() > 1)
      modify(0, n, st[st.size() - 1] - 1, n, 0, a[st[st.size() - 1]] - a[i]);
    st.emplace_back(i);
    res[i] = qry(0, n, st[lb] - 1, 0, inf);
    ans = max(ans, res[i] - i + 1);
  }
  printf("%d\n", ans);
  return 0;
}
