#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) #if defined(_MSC_VER) || __cplusplus > 199711L #define aut(r,v) auto r = (v) #else #define aut(r,v) __typeof(v) r = (v) #endif #define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it) #define all(o) (o).begin(), (o).end() #define pb(x) push_back(x) #define mp(x,y) make_pair((x),(y)) #define mset(m,v) memset(m,v,sizeof(m)) #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3fLL using namespace std; typedef vector vi; typedef pair pii; typedef vector > vpii; typedef long long ll; template inline void amin(T &x, U y) { if(y < x) x = y; } template inline void amax(T &x, U y) { if(x < y) x = y; } namespace pairing_heap { typedef int Val; typedef less Cmp; Cmp cmp = Cmp(); struct Node { Val val; Node *head, *next; Node() { } Node(const Val &val_): val(val_), head(NULL), next(NULL) { } }; Node *meld(Node *x, Node *y) { if(!x || !y) return x ? x : y; if(cmp(y->val, x->val)) swap(x, y); y->next = x->head; x->head = y; return x; } Node *meldList(Node *t) { Node *last = NULL; while(t) { Node *a = t, *b = t->next; if(!b) break; t = b->next; Node *c = meld(a, b); c->next = last; last = c; } while(last) { Node *next = last->next; t = meld(last, t); last = next; } return t; } Node *pop(Node *t) { Node *r = meldList(t->head); t->head = NULL; return r; } } int main() { using namespace pairing_heap; int N; scanf("%d", &N); vector A(N), B(N); rep(i, N) scanf("%d", &A[i]); rep(i, N) scanf("%d", &B[i]); sort(all(A)); rep(i, N) B[i] /= 2; const int X = *max_element(all(A)) + accumulate(all(B), 0); const int Y = 1500; const int logY = 11, maskY = (1 << logY) - 1; vector nodes(N); int ans = INF; rep(i, N) { Node *h = NULL; rep(j, N) { nodes[j] = Node((Val)A[j] << logY | 0); h = meld(h, &nodes[j]); } for(int j = i; ; ) { Node *p = h; h = pop(h); p->val += (Val)B[j] << logY | 1; h = meld(h, p); if((++ j) == N) j = 0; if(j == i) break; } int x = 0; rep(j, N) amax(x, (int)(nodes[j].val & maskY)); amin(ans, x); } printf("%d\n", ans); return 0; }