#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long s = 0, t = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') t = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return s * t;
}
const int N = 1e5 + 5;
const long long inf = 0x3f3f3f3f3f3f3f3f;
int n, top, Len = 1, s[N], nxt[N];
long long K, w[N], g[N], pre[N], suf[N];
vector<int> G[N];
long long a[N << 2], b[N << 2], d[N << 2], res[N << 2];
void Init(int x, long long t) { b[x] += t, res[x] -= t, d[x] += t; }
void Pushdown(int x) {
  if (!d[x]) return;
  Init(x << 1, d[x]), Init(x << 1 | 1, d[x]), d[x] = 0;
}
long long Calc(int x, int l, int r, long long t) {
  if (l == r) return a[x] - t;
  int mid = (l + r) >> 1;
  Pushdown(x);
  if (b[x << 1] < t) return min(Calc(x << 1, l, mid, t), res[x]);
  return min(a[x << 1] - t, Calc(x << 1 | 1, mid + 1, r, t));
}
void Build(int x, int l, int r) {
  if (l == r) {
    a[x] = b[x] = suf[l];
    return;
  }
  int mid = (l + r) >> 1;
  Build(x << 1, l, mid), Build(x << 1 | 1, mid + 1, r);
  a[x] = min(a[x << 1], a[x << 1 | 1]), b[x] = min(b[x << 1], b[x << 1 | 1]);
  res[x] = Calc(x << 1 | 1, mid + 1, r, b[x << 1]);
}
void Upd(int x, int l, int r, int ql, int qr, long long t) {
  if (ql <= l && r <= qr) {
    Init(x, t);
    return;
  }
  int mid = (l + r) >> 1;
  Pushdown(x);
  if (ql <= mid) Upd(x << 1, l, mid, ql, qr, t);
  if (qr > mid) Upd(x << 1 | 1, mid + 1, r, ql, qr, t);
  b[x] = min(b[x << 1], b[x << 1 | 1]),
  res[x] = Calc(x << 1 | 1, mid + 1, r, b[x << 1]);
}
int Find(int x, int l, int r, long long t) {
  if (l == r) return l;
  int mid = (l + r) >> 1;
  Pushdown(x);
  return a[x << 1 | 1] <= t ? Find(x << 1 | 1, mid + 1, r, t)
                            : Find(x << 1, l, mid, t);
}
int Solve(int x, int l, int r, long long &t) {
  if (l == r) {
    int tp = a[x] - t <= K ? l : 0;
    return t = min(t, b[x]), tp;
  }
  int mid = (l + r) >> 1;
  Pushdown(x);
  if (b[x << 1] < t) {
    if (res[x] <= K) return Solve(x << 1 | 1, mid + 1, r, t = b[x << 1]);
    int tp = Solve(x << 1, l, mid, t);
    return t = min(t, b[x]), tp;
  } else {
    int tp = a[x << 1] <= K + t ? Find(x << 1, l, mid, K + t) : 0;
    return max(tp, Solve(x << 1 | 1, mid + 1, r, t));
  }
}
void DFS(int x) {
  s[++top] = x;
  if (nxt[x] <= n) Upd(1, 1, n, nxt[x] - 1, n, pre[x] - pre[nxt[x]]);
  if (x <= n) {
    int l = 2, r = top - 1, res = 1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (pre[s[mid]] - pre[x] > K)
        res = mid, l = mid + 1;
      else
        r = mid - 1;
    }
    int lim = s[res] - 1;
    if (x > 1) Upd(1, 1, n, 1, x - 1, inf);
    Upd(1, 1, n, lim, n, -inf);
    long long tp = inf;
    int pos = Solve(1, 1, n, tp);
    if (x > 1) Upd(1, 1, n, 1, x - 1, -inf);
    Upd(1, 1, n, lim, n, inf);
    Len = max(Len, pos - x + 1);
  }
  for (auto y : G[x]) DFS(y);
  if (nxt[x] <= n) Upd(1, 1, n, nxt[x] - 1, n, pre[nxt[x]] - pre[x]);
  top--;
}
int main() {
  n = read(), K = read();
  for (int i = 1; i < n; i++) w[i] = read();
  for (int i = 1; i <= n; i++) g[i] = read();
  for (int i = 2; i <= n; i++) {
    pre[i] = pre[i - 1] + w[i - 1] - g[i - 1];
    suf[i] = suf[i - 1] + w[i - 1] - g[i];
  }
  for (int i = n; i >= 1; i--) {
    while (top && pre[s[top]] <= pre[i]) top--;
    nxt[i] = top ? s[top] : n + 1, s[++top] = i;
    G[nxt[i]].push_back(i);
  }
  nxt[n + 1] = n + 1, top = 0;
  Build(1, 1, n), DFS(n + 1), printf("%d", Len);
  return 0;
}
