# Return number of coconuts produced by a group of monkeys by time t
def coconuts_made(t, group):
    MAX = 2_000_000_000_000_000_000
    total = 0
    for first, interval in group:
        if t >= first:
            total += 1 + (t - first) // interval
            if total > MAX:
                return MAX
    return total


# Binary search minimal time for a group to produce at least n coconuts
def min_time_for(n, group):
    if n <= 0:
        return 0
    lo, hi = 0, 2_000_000_000_000_000_000
    answer = hi
    while lo <= hi:
        mid = (lo + hi) // 2
        if coconuts_made(mid, group) >= n:
            answer = mid
            hi = mid - 1
        else:
            lo = mid + 1
    return answer


def svada():
    total_time = int(input().strip())

    num_pickers = int(input().strip())
    pickers = [tuple(map(int, input().split())) for _ in range(num_pickers)]

    num_openers = int(input().strip())
    openers = [tuple(map(int, input().split())) for _ in range(num_openers)]

    lo_n, hi_n = 1, 2_000_000_000_000_000_000
    best_n = hi_n

    while lo_n <= hi_n:
        mid_n = (lo_n + hi_n) // 2
        t1 = min_time_for(mid_n, pickers)
        t2 = min_time_for(mid_n, openers)
        if t1 + t2 >= total_time:
            best_n = mid_n
            hi_n = mid_n - 1
        else:
            lo_n = mid_n + 1

    print(min_time_for(best_n, pickers))


if __name__ == "__main__":
    svada()
