I know the answer is practice, practice, practice, and I think I already put in enough effort since everywhere I go I read CF problem and editorials :D.
However, sometimes practicing the wrong things at the wrong times can make you fail and become discouraged. As a beginning intermediate level competitive programming enthusiast, I've struggled with many problems that seem to be very trivial (most of these are div 2 C and D). I've also noticed that sometimes I try to work with too many problem types at the same time. So, I thought if I practiced one type of problem at a time, gaining mastery in each one, I will eventually become really good at CP. Right now, I'm working on DP, but after this, what types of problems should I do? I feel like I shouldn't touch segment trees and network flows for now, because they seem too hard. Anybody have any suggestions as to what order I should learn these problem types in? Or is my idea of learning one topic at a time wrong?
Keep solving C and D problems,sort by users who solved the problem,use a2oj.com and solve about different topics in (categories) you can find a lot of algorithmic topics,keep practicing and solve problems for your enjoyment :D
http://codeforces.com/blog/entry/16599