I jaka decyzja?
Usuwanie elementu z vectora, wiąże się z przekopiowaniem pozostałych elementów o jeden element w lewo, więc jest mało efektywne. W liście jest lepiej, nie przeba przekopiowywać elementów.
Drugim hamulcem jest wyszukiwanie elementów do usunięcia - i w wektorze i w liście jest dużo za wolne.
PS
Szybkie wczytywanie [fast i/o] tu nie pomoże. Mam cin/cout i pewnie dlatego najgorszy czas, ale może jeszcze to przetestuję, no i oczywiście inni mogą mieć lepsze pomysły [algorytmy] na to zadanie.
PS 2
Dla małych danych twój program jest w miarę ok [odpowiednio szybki], ale "zrób" maksymalny test. Można go wygenerować np programem macierz nwd lub poniższym programikiem:
cout << "1000000\n";
for(int i = 0; i < 1000000; ++i)
cout << "1 ";
Potem, gdy okaże się, że plik jest za duży [program liczy za długo], wystarczy już tylko w wygenerowanym pliku odpowiednio zmniejszać tylko wartość n na dowolnie mniejszą, będącą kwadratem liczby, a pozostawić ilość jedynek nie zmienioną i testować, testować, testować i mierzyć czas wykonania kolejnych, poprawianych wersji.