1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long LL;
4 const int maxn=1e5+5;
5 int n,m;LL k,l,r,mid,ans,A[maxn],B[maxn];
6 inline LL read(){///读入优化
7 LL x=0,f=1;char ch=getchar();
8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
9 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
10 return x*f;
11 }
12 inline void print(LL x){///输出优化
13 if(x<0)putchar('-'),x=-x;
14 if(x>9)print(x/10);
15 putchar(x%10+'0');
16 }
17 bool check(LL mid){
18 LL cnt=0;
19 for(int i=0;i<n;++i){
20 int lt=0,rt=m-1;
21 while(lt<=rt){///二分找b数组中某个元素与当前A[i]乘积不小于mid的最大下标lt-1
22 int midt=(lt+rt)>>1;
23 if(A[i]*B[midt]>=mid)lt=midt+1;///说明可能还有更小的元素与A[i]相乘之后不小于mid,则往右边找
24 else rt=midt-1;///否则往左边找
25 }
26 cnt+=lt;///退出条件是rt=lt-1,而下标是0开始的,所以lt不用减1,累加当前满足条件的个数
27 }
28 return cnt>=k;
29 }
30 int main(){///时间复杂度为log2(nm)*n*log2(m)
31 while(~scanf("%d%d%lld",&n,&m,&k)){
32 for(int i=0;i<n;++i)A[i]=read();
33 for(int i=0;i<m;++i)B[i]=read();
34 sort(A,A+n,greater<LL>());///降序排
35 sort(B,B+m,greater<LL>());
36 l=A[n-1]*B[m-1],r=A[0]*B[0];
37 while(l<=r){///二分找第k大的数(即两个数的乘积)
38 mid=(l+r)>>1;
39 if(check(mid))l=mid+1;///说明mid可以更大,继续往右边找
40 else r=mid-1;///否则往左边找
41 }
42 print(l-1);puts("");
43 }
44 return 0;
45 }