#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const long long MAX = 5100000; const long long INF = 1LL << 60; const long long mod = 1000000007LL; //const long long mod = 998244353LL; using namespace std; typedef unsigned long long ull; typedef long long ll; ll n; vector a, b, c; bool memo[3050][3050]; bool dp[3050][3050]; bool dfs(ll cur1, ll cur2, ll p) { if (p < 0) return true; if (memo[cur1][cur2]) return dp[cur1][cur2]; bool flag = false; //cout << cur1 << " " << cur2 << " " << p << endl; if (cur1 + 1 <= n && a[cur1 + 1] + b[cur2] >= c[p]) flag |= dfs(cur1 + 1, cur2, p - 1); if (cur2 + 1 <= n && a[cur1] + b[cur2 + 1] >= c[p]) flag |= dfs(cur1, cur2 + 1, p - 1); memo[cur1][cur2] = true; return dp[cur1][cur2] = flag; } int main() { /* cin.tie(nullptr); ios::sync_with_stdio(false); */ scanf("%lld", &n); a.resize(n + 1); for (ll i = 0; i <= n; i++) scanf("%lld", &a[i]); b.resize(n + 1); for (ll i = 0; i <= n; i++) scanf("%lld", &b[i]); c.resize(n); for (ll i = 0; i < n; i++) scanf("%lld", &c[i]);; sort(c.begin(), c.end()); ll left = -1; ll right = n; while (right - left > 1) { ll mid = (left + right) >> 1; for (ll i = 0; i <= 3000; i++)for (ll j = 0; j <= 3000; j++) memo[i][j] = false, dp[i][j] = false; if (dfs(0, 0, mid)) left = mid; else right = mid; } printf("%lld\n", left + 1); return 0; }