On Bilevel Programming and Its Impact in Branching, Cutting and Complexity