#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <stdlib.h>
#include <signal.h>

using namespace std;

vector<long> _pierwsze;
const char *_save = "pierwsze.dump";

void Zapis( int = 0 ) {
    cout << "[*] Zapisuje do: " << _save << endl;

    ofstream f(_save);
    if ( !f )
        cout << "[!] Nie moge zapisac" << endl;
    else {
        for ( long i = 0; i < _pierwsze.size(); i++ )
            f << _pierwsze[i] << ' ';

        f.close();
    }

    exit(1);
}

void Wczytaj() {
    cout << "[*] Wczytuje z pliku: " << _save << endl;

    ifstream dump(_save);
    if ( !dump ) {
        cout << "[!] Nie moge otworzyc" << endl;
        return;
    }

    while ( 1 ) {
        int i;
        dump >> i;

        if ( dump.eof() )
            break;

        _pierwsze.push_back(i);
    }

    dump.close();
}

void Sito( long min, long max, vector<long> &pierwsze ) {
    assert(min >= 2);

    for ( long i = min; i <= max; ++i ) {
        for ( long j = 0; j < pierwsze.size(); ++j )
            if ( i % pierwsze[j] == 0 )
                goto end;

        pierwsze.push_back(i);
        end:;
    }
}

int main( int argc, char **argv ) {
    signal(SIGINT, Zapis);

    Wczytaj();

    const long min = _pierwsze.size() == 0 ? 2 : *(_pierwsze.end()-1)+1;
    const long max = argc == 2 ? atoi(argv[argc-1]) : 0;

    cout << "[*] Licze (Min: " << min << ", Max: " << max << ")\n";
    Sito(min, max, _pierwsze);

    Zapis();
}

