Munin, мне в этих статьях многое непонятно почему-то. Но я уже интуитивно кое-что понял, чего раньше не мог понять.
Например что %ld - это место переменной.
Да. Надо точно согласовывать эту запись (которая называется "спецификация формата") с той переменной, которую вы считываете, и с тем, в каком виде ожидаете информацию во входном файле. Например,
%d - 
int%ld - 
long int%f - 
float%lf - 
doubleОсобое внимание этому надо уделять для 
scanf - 
printf-то может вывести мусор, и всё, а 
scanf может записать мусор в память (причём даже в другие переменные), с фатальными последствиями для программы. Для 32-битных платформ обычно 
int совпадает с 
long int, так что и эти ошибки "прощаются", но вот 
float практически никогда не совпадает с 
double.
Еще я правильно понял, что программа попорядку считывает числа? А уже второй прогон она не пойдет, так как дойдет до окончания файла?
Да, если пользоваться только этими функциями - только так. Но можно использовать функции 
rewind(), 
fseek(), 
fsetpos(), и считать файл по второму проходу (или даже перемещаться в любое место файла, например, запомнив его с первого прохода). Правда, большинство олимпиадных задач для этого не приспособлены, там вполне достаточно однопроходного чтения.
-- 31.07.2012 21:50:06 --Просто на 
http://acmp.ru/article.asp?id_text=118 написано, что должно быть %ld и показано в примере.
Это просто означает, что в условиях 
http://acmp.ru/ это работает. Это не значит, что это совсем уж правильно.