The course enables the students to solve problems using basic and advance methods with traditional and special programming techniques. The students will be introduced to the theoretical concepts and set of practical problems will be discussed and implemented. The goal is to train students how to deal with problems and provide solution with different techniques and methods such as: what are the inputs and how to process them to solve a problem and produce the outputs. Introduce the students to different problem-solving approaches, such as: sequential, iterative, recursive, brute force, divide-and-conquer, greedy, dynamic, genetic, branching, and backtracking with their data structure implementation and analysis. Understand and use some of the advanced data structures and their implementation, like: Binary index tree, segment tree, disjoint sets. Understand and use some of the graph algorithms and their implementation, like: BFS, DFS, topological sorting, minimum spanning trees and shortest path and connected components. Implementation of common problems. Students will be asked to solve practical programming assignments and homework on each subject, and the solution will be discussed.