import collections,sys,math,functools,operator,itertools,bisect,heapq,decimal,string,time,random #sys.setrecursionlimit(10**9) #sys.set_int_max_str_digits(0) n,m,q = map(int,input().split()) item = [list(map(int,input().split())) for i in range(n)] ans = 0 asu = [0 for i in range(1<> j) & 1 == 1: a += item[j][0] b += item[j][1] if a <= q: asu[s] = b #or convolution andにする場合は配列をreverseしてからゼータ変換して点積をとってメビウス変換してreverseする def subset_zeta_transform(s): for i in range(n): for j in range(1<> i) & 1 == 0: s[j | (1 << i)] = max(s[j],s[j | (1 << i)]) return s asu = subset_zeta_transform(asu) for s in range(1<> j) & 1 == 1: a += item[j][0] b += item[j][1] else: r += (1 << j) if a <= m: ans = max(ans,b + asu[r]) print(ans)