Eu gostava bastante da URI Online Judge, atualmente é beecrowd https://www.beecrowd.com.br/judge/en/login, tem bastante desafios, de vários níveis.

Mas atualmente ouço falar mais da HackerRank e LeetCode...

Quanto ao que estudar, acredito que o ideal seria dominar estrutura de dados e algoritmos de busca, pois são os mais necessários/utilizados nesses desafios, mas como existem vários sites com desafios para treinar, provavelmente o mais eficiente seria seguir um site, ir realizando os desafios e aprendendo o que o desafio exige, pois no final das contas, além das habilidades de programação, você tem que estar com a capacidade de interpretação e raciocínio bastante afiado, e isso você só vai conseguir treinando mesmo e se expondo ao maior nível de problemas possível