import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static class Program {
public int cost;
public int profit;
public Program(int cost, int profit) {
this.cost = cost;
this.profit = profit;
}
}
//定义小根堆如何比较大小
public static class costMinComp implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
return o1.cost - o2.cost;
}
}
//定义大根堆如何比较大小
public static class costMaxComp implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
return o2.profit - o1.profit;
}
}
public static long getMaxMoney(long W, long K, int[] costs, int[] profits) {
if (W < 1 || K < 0 || costs == null || profits == costs || costs.length != profits.length) {
return W;
}
PriorityQueue<Program> costMinHeap = new PriorityQueue<>(new costMinComp());
PriorityQueue<Program> profitMaxHeap = new PriorityQueue<>(new costMaxComp());
for (int i = 0; i < costs.length; i++) {
costMinHeap.add(new Program(costs[i], profits[i]));
}
//依次做K个项目
for (int i = 1; i <=K ; i++) {
while (!costMinHeap.isEmpty()&&costMinHeap.peek().cost<=W){
profitMaxHeap.add(costMinHeap.poll());
}
if(profitMaxHeap.isEmpty()){
return W;
}
W+=profitMaxHeap.poll().profit;
}
return W;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String[] strings=in.nextLine().split(" ");
int n=Integer.parseInt(strings[0]);
int W=Integer.parseInt(strings[1]);
int K=Integer.parseInt(strings[2]);
int[] costs=new int[n];
int[] profits=new int[n];
for (int i = 0; i <n ; i++) {
costs[i]=in.nextInt();
}
for (int i = 0; i <n ; i++) {
profits[i]=in.nextInt();
}
long res=getMaxMoney(W,K,costs,profits);
System.out.println(res);
}
}