#include <bits/stdc++.h>
using namespace std;
namespace FGF {
const int N = 1e5 + 5;
const long long INF = 0x3f3f3f3f3f3f3f3f;
int g[N], w[N], n, m, nxt[N], st[N], ans = 1, tp;
struct tree {
  long long ans, ami, bmi, ta;
} t[N << 2];
long long pre[N], suf[N];
vector<int> G[N];
void add(int ro, long long x) { t[ro].bmi += x, t[ro].ans -= x, t[ro].ta += x; }
void pushdown(int ro) {
  if (t[ro].ta)
    add(ro << 1, t[ro].ta), add(ro << 1 | 1, t[ro].ta), t[ro].ta = 0;
}
long long pushup(int ro, int l, int r, long long p) {
  if (l == r) return t[ro].ami - p;
  pushdown(ro);
  return t[ro << 1].bmi < p
             ? min(pushup(ro << 1, l, ((l + r) >> 1), p), t[ro].ans)
             : min(t[ro << 1].ami - p,
                   pushup(ro << 1 | 1, ((l + r) >> 1) + 1, r, p));
}
void build(int ro, int l, int r) {
  if (l == r) {
    t[ro].ami = t[ro].bmi = suf[l];
    return;
  }
  build(ro << 1, l, ((l + r) >> 1)), build(ro << 1 | 1, ((l + r) >> 1) + 1, r);
  t[ro].ans = pushup(ro << 1 | 1, ((l + r) >> 1) + 1, r, t[ro << 1].bmi);
  t[ro].ami = min(t[ro << 1].ami, t[ro << 1 | 1].ami),
  t[ro].bmi = min(t[ro << 1].bmi, t[ro << 1 | 1].bmi);
}
void updat(int ro, int l, int r, int L, int R, long long x) {
  if (L <= l && r <= R) return add(ro, x);
  pushdown(ro);
  if (L <= ((l + r) >> 1)) updat(ro << 1, l, ((l + r) >> 1), L, R, x);
  if (R > ((l + r) >> 1)) updat(ro << 1 | 1, ((l + r) >> 1) + 1, r, L, R, x);
  t[ro].bmi = min(t[ro << 1].bmi, t[ro << 1 | 1].bmi);
  t[ro].ans = pushup(ro << 1 | 1, ((l + r) >> 1) + 1, r, t[ro << 1].bmi);
}
int query2(int ro, int l, int r, long long x) {
  if (l == r) return l;
  return t[ro << 1 | 1].ami <= x ? query2(ro << 1 | 1, ((l + r) >> 1) + 1, r, x)
                                 : query2(ro << 1, l, ((l + r) >> 1), x);
}
int query(int ro, int l, int r, long long &x) {
  if (l == r) {
    int tmp = t[ro].ami - x <= m ? l : 0;
    x = min(x, t[ro].bmi);
    return tmp;
  }
  pushdown(ro);
  if (x > t[ro << 1].bmi) {
    if (t[ro].ans <= m)
      return query(ro << 1 | 1, ((l + r) >> 1) + 1, r, x = t[ro << 1].bmi);
    int tmp = query(ro << 1, l, ((l + r) >> 1), x);
    x = min(x, t[ro].bmi);
    return tmp;
  } else {
    int tmp =
        (t[ro << 1].ami <= m + x ? query2(ro << 1, l, ((l + r) >> 1), m + x)
                                 : 0);
    return max(tmp, query(ro << 1 | 1, ((l + r) >> 1) + 1, r, x));
  }
}
void dfs(int u) {
  if (nxt[u] <= n) updat(1, 1, n, nxt[u] - 1, n, pre[u] - pre[nxt[u]]);
  if (u <= n) {
    int l = 2, r = tp, s = 1;
    long long x = INF;
    while (l <= r)
      pre[st[((l + r) >> 1)]] - pre[u] > m
          ? (s = ((l + r) >> 1), l = ((l + r) >> 1) + 1)
          : r = ((l + r) >> 1) - 1;
    if (u > 1) updat(1, 1, n, 1, u - 1, INF);
    ans = max(ans, min(st[s] - 1, query(1, 1, n, x)) - u + 1);
    if (u > 1) updat(1, 1, n, 1, u - 1, -INF);
  }
  st[++tp] = u;
  for (auto v : G[u]) dfs(v);
  if (nxt[u] <= n) updat(1, 1, n, nxt[u] - 1, n, pre[nxt[u]] - pre[u]);
  tp--;
}
void work() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) scanf("%d", &w[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &g[i]);
  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 = 1; i <= n; i++) nxt[i] = n + 1;
  for (int i = n; i; i--) {
    while (tp && pre[st[tp]] <= pre[i]) tp--;
    if (tp) nxt[i] = st[tp];
    st[++tp] = i;
    G[nxt[i]].push_back(i);
  }
  build(1, 1, n);
  tp = 0;
  dfs(n + 1);
  printf("%d\n", ans);
}
}  // namespace FGF
int main() {
  FGF::work();
  return 0;
}
