SIGSEGV występuje gdy odwołujesz się do pamięci, która nie jest zarezerwowana. Więc zazwyczaj jest on spowodowany podawaniem indeksu tablicy/vektora powyżej jej rozmiaru.
Może to też być ujemny indeks lub odwoływanie się do pamięci, którą wcześniej zwolniłeś przez delete albo wskaźnika z nieprawidłowym/nieprzypisanym adresem.
Sądząc po tym co napisałeś, że nie wiesz jak działa wymiana danych na spoj to jest na bank twój błąd.
(Prawie) zawsze masz w zadaniu wejście i wyjście. Masz napisać program konsolowy, który otrzyma plik na standardowe wejście i zwróci drugi plik na standardowe wyjście. Potem wyjście jest porównywane z wyjściem autora zadania lub sprawdzane przez napisany przez niego kod.
To samo możesz zrobić w zbudowanym u siebie pliku wynikowym aplikacji. Jeżeli plik z wejściem to in.txt a twój program to program.exe to:
program.exe < in.txt > out.txt
Spowoduje jego uruchomienie i zapisanie twojego wyniku w out.txt. Takich wywołań może być więcej niż jedno dla każdego zgłoszenia, ale czy użyjesz while(cin>>x)
czy jakiejkolwiek innej metody żeby “zamienić” in na out to zależy tylko i wyłącznie od Ciebie.
Chłopie to są podstawy. Zacznij może zrobienia jakiegoś prostego zadania zanim zaczniesz robić operacje numeryczne za hajsy… 
PS. Jeszcze jedna rzecz do sprawdzenia, zapis typu:
int n;
cin >> n;
int a[n];
To prawdopodobnie też może dawać SIGSEGV. Taki zapis nie jest zgodny ze składnią C++, ale działa w większości kompilatorów. Za to może powodować błędy, zwłaszcza dla dużych n. Wspominam o tym, bo pojawia się on dość często, np. w kodzie do książki “Algorytmika Praktyczna” P. Stańczyka.
PS2.
Nic niestandardowego. Spoj tylko uruchamia podany w nawiasach kompilator. Dla C++ jest to zazwyczaj gcc:
- zakończenie linii na spoj to ‘\n’ ASCII 10
- koniec pliku na spoj to EOF, wartość -1
Bardzo rzadko zdarza się, żeby autorzy wrzucali jakieś inne białe znaki do wejścia. Raz widziałem tabulatory zamiast spacji, wtedy można mieć pretensje do autora zadania.