← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

type Cup struct {
	c int64
	w int64
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024)

	readInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	readInt64 := func() int64 {
		scanner.Scan()
		res, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		return res
	}

	n := readInt()
	m := readInt()
	d := readInt64()

	pCups := make([]Cup, n)
	for i := 0; i < n; i++ {
		pCups[i] = Cup{c: readInt64(), w: readInt64()}
	}

	iCups := make([]Cup, m)
	for i := 0; i < m; i++ {
		iCups[i] = Cup{c: readInt64(), w: readInt64()}
	}

	sort.Slice(pCups, func(i, j int) bool {
		if pCups[i].c != pCups[j].c {
			return pCups[i].c > pCups[j].c
		}
		return pCups[i].w < pCups[j].w
	})

	sort.Slice(iCups, func(i, j int) bool {
		if iCups[i].c != iCups[j].c {
			return iCups[i].c > iCups[j].c
		}
		return iCups[i].w < iCups[j].w
	})

	wP := make([]int64, n+1)
	cP := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		wP[i] = wP[i-1] + pCups[i-1].w
		cP[i] = cP[i-1] + pCups[i-1].c
	}

	wI := make([]int64, m+1)
	cI := make([]int64, m+1)
	for i := 1; i <= m; i++ {
		wI[i] = wI[i-1] + iCups[i-1].w
		cI[i] = cI[i-1] + iCups[i-1].c
	}

	var ans int64 = 0
	j := m
	for i := 1; i <= n; i++ {
		for j >= 1 && wP[i]+wI[j] > d {
			j--
		}
		if j >= 1 {
			if cP[i]+cI[j] > ans {
				ans = cP[i] + cI[j]
			}
		}
	}

	fmt.Println(ans)
}