I almost always use printf/scanf, because they are a lot faster. When my code gets TLE and the time complexity of the solution is similar to the complexity of the input, I use getchar_unlocked() and parse the input by myself. Even scanf -- faster than cin -- is still too slow. In SPOJ BR I got 0.5s in a problem with scanf, 0.17s with getchar and 0.02s with getchar_unlocked().
It means that, if the input is O(n²) and the expected solution is O(n²), maybe you can solve it in O(n² lg n) time just by parsing the input yourself (so, you don't spend much time with the input and get a lot of extra time for the solution). PS: I don't use atoi. Converting to integer WHILE reading the input is faster... for each algarism c you read, you update your integer to: x = 10*x + (c-'0').