import std; void main () { // なるたけどれもデカいほうが良い。部分集合といいつつ、削るなら最小要素から削るべき(要素数は負にならないので、できるだけでかい方がお得) // O(N^3)しかわからんけど... int[3] N; int[][3] X; readln.read(N[0], N[1], N[2]); X[0] = readln.split.to!(int[]); X[1] = readln.split.to!(int[]); X[2] = readln.split.to!(int[]); solve(N, X); } void solve (int[3] N, int[][3] X) { // O(N^3) foreach (ref x; X) x.sort!"a>b"; int[][3] sum; foreach (i, ref s; sum) s = new int[](N[i]+1); foreach (idx, ref s; sum) foreach (i, ref ss; s) { if (i == 0) { ss = 0; continue; } ss = s[i-1] + X[idx][i-1]; } long ans = -long.max; for (int i = 0; i <= N[0]; i++) for (int j = 0; j <= N[1]; j++) for (int k = 0; k <= N[2]; k++) { ans = max(ans, sum[0][i]*j + sum[1][j]*k + sum[2][k]*i); } writeln(ans); } void read(T...)(string S, ref T args) { auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }