#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e5 + 10;
const long long INF = 1e18;
long long n, k, d[maxn], a[maxn], ans = 1, f[maxn], g[maxn], top;
pair<long long, long long> Stack[maxn];
struct node {
  long long Min, lazy, val;
} Tree[maxn << 2];
inline void PushUp(long long root) {
  Tree[root].Min = min(Tree[root << 1].Min, Tree[root << 1 | 1].Min);
}
inline void PushDown(long long root) {
  if (!Tree[root].lazy) return;
  long long x = Tree[root].lazy;
  Tree[root].lazy = 0;
  Tree[root << 1].lazy += x;
  Tree[root << 1].Min += x;
  Tree[root << 1 | 1].lazy += x;
  Tree[root << 1 | 1].Min += x;
}
inline void Build(long long root, long long l, long long r) {
  Tree[root].Min = INF;
  if (l == r) {
    Tree[root].val = g[l];
    return;
  }
  long long Mid = l + r >> 1;
  Build(root << 1, l, Mid);
  Build(root << 1 | 1, Mid + 1, r);
  Tree[root].val = min(Tree[root << 1].val, Tree[root << 1 | 1].val);
}
inline void Modify(long long root, long long l, long long r, long long L,
                   long long R, long long val) {
  if (L <= l && r <= R) {
    Tree[root].lazy += val;
    Tree[root].Min += val;
    return;
  }
  long long Mid = l + r >> 1;
  PushDown(root);
  if (L <= Mid) Modify(root << 1, l, Mid, L, R, val);
  if (Mid < R) Modify(root << 1 | 1, Mid + 1, r, L, R, val);
  PushUp(root);
}
inline long long Query(long long root, long long l, long long r, long long Min,
                       long long x) {
  if (l > x) return 0;
  if (Tree[root].val - k > Min) return 0;
  if (l == r) return l;
  long long ans = 0, Mid = l + r >> 1;
  PushDown(root);
  if (min(Min, Tree[root << 1].Min) >= Tree[root << 1 | 1].val - k) {
    ans = Query(root << 1 | 1, Mid + 1, r, min(Min, Tree[root << 1].Min), x);
    if (ans) return ans;
  }
  return Query(root << 1, l, Mid, Min, x);
  ;
}
inline long long Get(long long x) {
  long long L = 1, R = top, pos = -1;
  while (L <= R) {
    long long Mid = L + R >> 1;
    if (Stack[Mid].first >= x) {
      pos = Mid;
      R = Mid - 1;
    } else
      L = Mid + 1;
  }
  return Stack[pos - 1].second - 1;
}
signed main() {
  scanf("%lld%lld", &n, &k);
  for (long long i = (1), _end_ = (n - 1); i <= _end_; ++i)
    scanf("%lld", &d[i]);
  for (long long i = (1), _end_ = (n); i <= _end_; ++i) scanf("%lld", &a[i]);
  for (long long i = (1), _end_ = (n); i <= _end_; ++i) {
    f[i] = f[i - 1] + a[i - 1] - d[i - 1];
    g[i] = g[i - 1] + d[i - 1] - a[i];
  }
  Stack[++top] = pair<long long, long long>(-INF, n + 1);
  Build(1, 1, n);
  for (long long i = n; i >= 1; --i) {
    Modify(1, 1, n, i, i, -INF + g[i]);
    while (Stack[top].first >= f[i]) {
      pair<long long, long long> x = Stack[top--];
      if (Stack[top].second <= n) {
        long long val = x.first - Stack[top].first;
        Modify(1, 1, n, Stack[top].second - 1, n, val);
      }
    }
    if (Stack[top].second <= n) {
      long long val = f[i] - Stack[top].first;
      Modify(1, 1, n, Stack[top].second - 1, n, -val);
    }
    Stack[++top] = pair<long long, long long>(f[i], i);
    long long L = i + 1, R = Get(f[i] - k);
    ans = max(ans, Query(1, 1, n, INF, R) - i + 1);
  }
  printf("%lld\n", ans);
  return 0;
}
