Younger students may need to get experience solving simple problems before start learning algorithms. We would recommend to solve as much problems as possible from the Codeforces problem set to get experience dissecting easy statements and learning how to read/write the test cases. Codeforces:
It is possible to sort the list by number of people that solved the problem. This is more or less and indication of the difficulty of the problem. Don’t be afraid to check the solution if you don’t know how to solve a problem.
Once the student has completed around 100 problems it is a good idea to try USACO Training Pages.
USACO contains hundreds of problems with short texts explaining some topics such as brute force or graphs.
The recommended language for programming contests is C++ or Java. Languages such as Python are supported in contests but it is not guaranteed that are fast enough to solve all the problems.


In order to be competitive, students must learn the basic algorithms and data structures. The classic approach is to read a book about algorithms:
  • Cormen’s book “Introduction to Algorithms” is probably the most famous. It covers a huge list of topics. The only issue with this book is that the authors use pseudo code instead of an existing language and the readers have to “translate” the code themselves.
  • For Java programmers the best option is Sedgewick’s “Algorithms”. It covers a wide range of basic algorithms in pure Java.
  • From the C++ perspective Skiena’s “The Algorithm Design Manual” is probably the most complete.
  • Any other algorithms/data structures book may be enough to learn the basics. The three book above are just the most famous.

Steven Halim's book Competitive Programming is the thee book for aspiring IOI contestants. Readers must have some background knowledge in basic data structures, algorithms, and programming languages and it uses both C++ and Java code to illustrate the algorithmic concepts. The first edition is now free as a PDF but we would recommend purchasing the latest 3rd Edition:

Also check out Steven's Visualgo site  which visualising data structures and algorithms through animation. A brilliant site, which can help you understand how various data structures are built and the algoritm sequence to search them. We would encourage you to use the Training element to each section to test your knowledge of the subject.

Online Courses

In the last few years university-level online courses have becoming extremely popular. They provide lectures in video format, weekly exercises, forums for asking questions, etc. Coursera has several courses about algorithms. The two best courses in my opinion are:

Online Training

USACO Training Pages provides a set of problems in increasing difficulty with solution / topic explainations for each section you complete.

Codeforces is a great web for training too but sorting by number of people that solved each problem as suggested for juniors may be boring and time-consuming. For seniors I recommend going to the Contests section Pick a random (division 2) contest there and try to solve all the problems looking at the solutions if needed.

You can also sort problems on Codeforces by the problem type:


Practice, Practice, Practice - Regular Online Competitions

Of course, besides learning the theory, the competitor should practice as much as possible solving problems. 

Participating in online contests is a good way to measure our progress. USACO organizes a contest almost every month. Codeforces rounds are held once or twice per week. USACO has 3 divisions (bronze, silver and gold) while Codeforces has 2 (div 2 and div 1). Doing well in one contest will usually move the student to the next division for the next contest. TopCoder has 2 competitions per month: 

COCI is the Croatian Open Competition in Informatics. They hold 3 hour online competitons periodically from October to the following April to selection their team for the IOI. The competitions are held in the afternoon on a Saturday and are open to any secondary level student to participate. Each competition has 6 tasks of varying difficulty and are fantastic practice for the AIPO Finals. They also have archive of almost 10 year's worth of COCI competitons with problems, test data and solutions available.

Other competitions:

Even more important than participating is the follow-up of the contest. A few days after the contest they usually publish explanations on how to solve the problems. It is highly recommended to read all the solutions to learn new ideas or algorithms and to try to solve the problems that you couldn’t solve during the contest.