#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+1;
ll a[N],b[N];//这里之所以用ll是因为 后面a[i]会变为前面的数累加
int n,m,k;
int fun(int mid){//mid为通过关卡数
// fun函数用于计算给定总通关数mid时的最小紫水晶消耗。
ll ans=k+1;//设定一个大于给定k的值 后面不断更新ans为最小消耗紫水晶数
for(int i=0;i<=mid;i++){//遍历从0到mid的所有可能的左关卡数i,并检查通过i个左关卡和mid-i个右关卡的紫水晶总消耗。
if(i>n||mid-i>m)continue; //通过i个左关卡数大于n或者右关卡数大于m时跳出循环 不能让a,b越界
ans=min(ans,a[i]+b[mid-i]);//比较当前的ans和通过i个左关卡与mid-i个右关卡所需要的紫水晶的总和,ans返回最小的紫水晶总消耗
}
return ans;//这个数值将会被用在二分查找中决定最大化关卡数
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];//这是通过前缀和的方式更新a[i] 保存通过左边每个关卡和所需的紫水晶数量
}
for(int i=1;i<=m;i++){
cin>>b[i];
b[i]+=b[i-1];//这是通过前缀和的方式更新b[i] 保存通过右边每个关卡所需的紫水晶数量
}
int l=0,r=n+m+1;//因为二分查找性质,通常希望右边界是一个不可能的值,l停留在最后一个可能的值,r停留在第一个不可能的值
while(l+1!=r){//为什么是l+1!=r 保证l和r相邻时循环会停止,l和r之间没有其他值 就是最大值了 r是第一个不能满足条件的值
int mid=(l+r)/2;
if(fun(mid)>k) r=mid;
//如果fun(mid)返回的紫水晶消耗大于k,则将r更新为 mid;否则,将 l更新为 mid。
else l=mid;
}
cout<<l;//输出 l 作为可能通过的最大关卡数
return 0;
}