Foundations of Computer Science: Abstraction, Algorithms, and Data Structures