#include <bits/stdc++.h>
using namespace std;
const int kMax = 10000 + 100;
struct Item {
  int a, b;
};
int d[kMax][2];
int n, l, r;
void update(int val, int importance) {
  for (int i = kMax - 1; i >= 0; --i) {
    for (int nu = 1; nu >= 0; --nu) {
      if (d[i][nu] == -1) continue;
      if (importance == 0) {
        d[i + val][nu] = max(d[i + val][nu], d[i][nu]);
      } else {
        int inc = 0;
        if (l <= i && i <= r) {
          inc = 1;
        }
        d[i + val][nu] = max(d[i + val][nu], d[i][nu] + inc);
        d[i][1] = max(d[i][1], d[i][nu]);
      }
    }
  }
}
int remain[kMax];
int main() {
  cin >> n >> l >> r;
  vector<Item> a(n);
  for (int i = 0; i < (int)(n); i++) {
    cin >> a[i].a;
  }
  for (int i = 0; i < (int)(n); i++) {
    cin >> a[i].b;
  }
  sort(a.begin(), a.end(), [](Item x, Item y) {
    if (x.b != y.b) return x.b < y.b;
    return x.a > y.a;
  });
  memset(d, -1, sizeof d);
  d[0][0] = 0;
  int ans = 0;
  for (int i = 0; i < (int)(n); i++) {
    update(a[i].a, a[i].b);
  }
  for (int i = 0; i < (int)(kMax); i++) {
    for (int nu = 0; nu < (int)(2); nu++) {
      if (l <= i && i <= r && nu > 0) {
        ans = max(ans, d[i][nu] + 1);
      }
      ans = max(ans, d[i][nu]);
    }
  }
  cout << ans << endl;
  return 0;
}
