#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10, mod = 1e9 + 7;
const long long inf = 1e18 + 10, Big = 1e15 + 10;
long long a[maxn], b[maxn], pre[maxn];
int nxt[maxn], n;
long long val[maxn], mx[maxn], mx2[maxn];
struct segment {
  long long val[4 * maxn], lz[4 * maxn];
  void shift(int l, int r, int id) {
    val[id] += lz[id];
    if (r - l > 1) {
      lz[2 * id] += lz[id];
      lz[2 * id + 1] += lz[id];
    }
    lz[id] = 0;
  }
  void add(int f, int s, long long x, int l = 0, int r = n, int id = 1) {
    if (f >= s || l >= r) return;
    shift(l, r, id);
    if (s <= l || r <= f) return;
    if (f <= l && r <= s) {
      lz[id] = x;
      shift(l, r, id);
      return;
    }
    int mid = (l + r) >> 1;
    add(f, s, x, l, mid, 2 * id);
    add(f, s, x, mid, r, 2 * id + 1);
    val[id] = min(val[2 * id], val[2 * id + 1]);
  }
  long long ask(int f, int s, int l = 0, int r = n, int id = 1) {
    if (f >= s || l >= r) return inf;
    shift(l, r, id);
    if (s <= l || r <= f) return inf;
    if (f <= l && r <= s) return val[id];
    int mid = (l + r) >> 1;
    return min(ask(f, s, l, mid, 2 * id), ask(f, s, mid, r, 2 * id + 1));
  }
  int fnd_last(int pos, long long x, int l = 0, int r = n, int id = 1) {
    shift(l, r, id);
    if (r <= pos || val[id] > x) return -1;
    if (r - l == 1) return l;
    int mid = (l + r) >> 1;
    int ans = fnd_last(pos, x, mid, r, 2 * id + 1);
    if (ans == -1) ans = fnd_last(pos, x, l, mid, 2 * id);
    return ans;
  }
  int fnd(int pos, long long x, int l = 0, int r = n, int id = 1) {
    shift(l, r, id);
    if (r <= pos || val[id] > x) return n;
    if (r - l == 1) return l;
    int mid = (l + r) >> 1;
    int ans = fnd(pos, x, l, mid, 2 * id);
    if (ans == n) ans = fnd(pos, x, mid, r, 2 * id + 1);
    return ans;
  }
};
segment seg1, seg2, seg3;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie();
  int k;
  cin >> n >> k;
  for (int i = 0; i < n - 1; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> b[i];
  }
  pre[0] = b[0];
  seg3.add(0, 1, -pre[0]);
  for (int i = 1; i < n; i++) {
    pre[i] = pre[i - 1] + b[i] - a[i - 1];
    seg3.add(i, i + 1, -pre[i]);
  }
  for (int i = n - 1; i >= 0; i--) {
    seg1.add(i, n, b[i] - a[i]);
    seg2.add(i + 1, n, a[i]);
    seg2.add(i, n, -b[i]);
    nxt[i] = seg1.fnd(i, 0) + 1;
    if (nxt[i] == n + 1) {
      nxt[i] = n;
      val[i] = 0;
    } else {
      val[i] = -seg1.ask(nxt[i] - 1, nxt[i]);
    }
    mx2[i] = mx[i] = -seg2.ask(i, nxt[i]);
    if (i != 0) mx[i] = max(mx[i], a[i - 1]);
  }
  cout << endl;
  int ans = 1;
  stack<int> st, mxs;
  mxs.push(n);
  for (int i = n - 1; i >= 0; i--) {
    while (int((st).size()) && st.top() < nxt[i]) {
      int u = st.top();
      st.pop();
      seg3.add(u, nxt[u], -(pre[u] - b[u]));
      seg3.add(nxt[u], n, -val[u]);
    }
    while (int((mxs).size()) > 1 && mx[mxs.top()] <= mx2[i]) {
      int l = mxs.top();
      mxs.pop();
      int r = mxs.top();
      seg3.add(l, r, -mx[l]);
    }
    seg3.add(nxt[i], n, val[i]);
    seg3.add(i, nxt[i], pre[i] - b[i]);
    seg3.add(i, mxs.top(), mx2[i]);
    ans = max(ans, seg3.fnd_last(i, k) - i + 1);
    seg3.add(i, mxs.top(), -mx2[i]);
    while (int((mxs).size()) > 1 && mx[mxs.top()] <= mx[i]) {
      int l = mxs.top();
      mxs.pop();
      int r = mxs.top();
      seg3.add(l, r, -mx[l]);
    }
    seg3.add(i, mxs.top(), mx[i]);
    st.push(i);
    mxs.push(i);
  }
  return cout << ans << endl, 0;
}
