#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, K, top, cnt, ans;
int st[maxn], to[maxn], nxt[maxn], head[maxn], nt[maxn];
long long g[maxn], w[maxn], pre[maxn], suf[maxn];
long long mp[maxn << 2], sp[maxn << 2];
long long ms[maxn << 2], tag[maxn << 2];
inline void add(int a, int b) {
  to[cnt] = b, nxt[cnt] = head[a], head[a] = cnt++;
}
inline void upd(int x, long long y) { tag[x] += y, ms[x] += y, sp[x] += y; }
inline void pushdown(int x) {
  if (tag[x]) {
    upd(x << 1, tag[x]), upd(x << 1 | 1, tag[x]);
    tag[x] = 0;
  }
}
long long calc(int l, int r, int x, long long t) {
  if (l == r) return t + mp[x];
  pushdown(x);
  int mid = (l + r) >> 1;
  if (ms[x << 1] >= t) return min(calc(l, mid, x << 1, t), sp[x]);
  return min(t + mp[x << 1], calc(mid + 1, r, x << 1 | 1, t));
}
inline void pushup(int l, int r, int x) {
  ms[x] = max(ms[x << 1], ms[x << 1 | 1]);
  int mid = (l + r) >> 1;
  sp[x] = calc(mid + 1, r, x << 1 | 1, ms[x << 1]);
}
void build(int l, int r, int x) {
  if (l == r) {
    ms[x] = suf[l];
    mp[x] = -suf[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, x << 1), build(mid + 1, r, x << 1 | 1);
  pushup(l, r, x), mp[x] = min(mp[x << 1], mp[x << 1 | 1]);
}
void updata(int l, int r, int x, int a, int b, long long t) {
  if (a > b) return;
  if (a <= l && r <= b) {
    upd(x, t);
    return;
  }
  pushdown(x);
  int mid = (l + r) >> 1;
  if (a <= mid) updata(l, mid, x << 1, a, b, t);
  if (b > mid) updata(mid + 1, r, x << 1 | 1, a, b, t);
  pushup(l, r, x);
}
int solve(int l, int r, int x, long long t) {
  if (l == r) return t + mp[x] <= K ? l : 0;
  pushdown(x);
  int mid = (l + r) >> 1;
  if (t + mp[x << 1 | 1] <= K) return solve(mid + 1, r, x << 1 | 1, t);
  return solve(l, mid, x << 1, t);
}
int query(int l, int r, int x, long long t) {
  if (l == r) return t + mp[x] <= K ? l : 0;
  pushdown(x);
  int mid = (l + r) >> 1;
  if (ms[x << 1] >= t) {
    if (sp[x] <= K)
      return query(mid + 1, r, x << 1 | 1, ms[x << 1]);
    else
      return query(l, mid, x << 1, t);
  } else {
    return max(solve(l, mid, x << 1, t), query(mid + 1, r, x << 1 | 1, t));
  }
}
void init(int l, int r, int x) {
  if (l == r) return;
  pushdown(x);
  int mid = (l + r) >> 1;
  init(l, mid, x << 1), init(mid + 1, r, x << 1 | 1);
}
void dfs(int x) {
  st[++top] = x;
  if (x != n + 1) {
    updata(1, n, 1, 1, x - 1, -1e17);
    updata(1, n, 1, nt[x] - 1, n, pre[x - 1] - pre[nt[x] - 1]);
    int l = 1, r = top, mid;
    while (l < r) {
      mid = (l + r) >> 1;
      if (pre[x - 1] - pre[st[mid] - 1] <= K)
        r = mid;
      else
        l = mid + 1;
    }
    updata(1, n, 1, st[r - 1], n, 1e17);
    ans = max(ans, query(1, n, 1, -1e17) - x + 1);
    updata(1, n, 1, st[r - 1], n, -1e17);
    updata(1, n, 1, 1, x - 1, 1e17);
  }
  for (int i = head[x]; i != -1; i = nxt[i]) dfs(to[i]);
  if (x != n + 1) {
    updata(1, n, 1, nt[x] - 1, n, -(pre[x - 1] - pre[nt[x] - 1]));
  }
  top--;
}
inline int rd() {
  int ret = 0, f = 1;
  char gc = getchar();
  while (gc < '0' || gc > '9') {
    if (gc == '-') f = -f;
    gc = getchar();
  }
  while (gc >= '0' && gc <= '9') ret = ret * 10 + (gc ^ '0'), gc = getchar();
  return ret * f;
}
int main() {
  memset(head, -1, sizeof(head));
  n = rd(), K = rd();
  int i;
  for (i = 1; i < n; i++) w[i] = rd();
  w[n] = 1e17;
  for (i = 1; i <= n; i++)
    g[i] = rd(), pre[i] = pre[i - 1] + g[i] - w[i],
    suf[i] = suf[i - 1] + g[i] - w[i - 1];
  for (st[top = 0] = n, i = n - 1; i >= 0; i--) {
    while (top && pre[st[top]] >= pre[i]) top--;
    nt[i + 1] = st[top] + 1, add(st[top] + 1, i + 1), st[++top] = i;
  }
  build(1, n, 1);
  top = 0, dfs(n + 1);
  printf("%d", ans);
  return 0;
}
