{.warning[SmallLshouldNotBeUsed]: off.} import strutils, sequtils, algorithm, future proc f(v, w: seq[int], m, vm: int): bool = var n = v.len dp = newSeqWith(n+1, newSeq[int](m+1)) for i in countDown(n-1, 0): for j in 0..m: if j < w[i]: dp[i][j] = dp[i+1][j] else: dp[i][j] = max(dp[i+1][j], dp[i+1][j-w[i]] + v[i]) result = dp[0][m] < vm proc g(v, w: seq[int], m, vm: int): bool = var n = v.len dp = newSeqWith(n+1, newSeq[int](m+1)) for i in countDown(n-1, 0): for j in 0..m: if j < w[i]: dp[i][j] = dp[i+1][j] else: dp[i][j] = max(dp[i+1][j], dp[i+1][j-w[i]] + v[i]) result = dp[0][m] <= vm when isMainModule: var n = stdin.readLine.parseInt v = newSeq[int](n) w = newSeq[int](n) for i in 0.. 1: var m = (l + r) div 2 if f(v, w, m, vm): l = m else: r = m var a = -1 for i in max(1, l-5)..l+5: if not f(v, w, i, vm): a = i break echo a (l, r) = (-1, 200000) while r - l > 1: var m = (l + r) div 2 if g(v, w, m, vm): l = m else: r = m var b = l-5 for i in max(1, l-5)..l+5: if g(v, w, i, vm): b = i else: break if not g(v, w, b+1, vm): echo b else: echo "inf"