1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <cstdio>
#include <vector>
#include <set>
#include <cstdint>
#include <cmath>
#include <map>
#include <tuple>

int main() {
    int64_t plansza;
    int zdarzen;

    scanf("%ld %d", &plansza, &zdarzen);

    std::set<int64_t> kamienie;
    std::set<std::tuple<int, int64_t, int64_t>> kolejka;

    std::vector<int64_t> pierwsze;
    {
        std::vector<int64_t> sito((plansza) + 2, 1);
        sito[0] = 0;
        sito[1] = 0;
        for(int i=2; i<sito.size(); ++i) {
            if (sito[i]) {
                for (int j=2*i;j<sito.size(); j+=i) {
                    sito[j] = 0;
                }
                pierwsze.emplace_back(i);
            }
        }
    }
    std::map<int64_t,std::map<int64_t,int>> wyniki;

    while (zdarzen --> 0) {
        int64_t pole;
        scanf("%ld", &pole);
        auto kamien = kamienie.find(pole);
        bool byl = (kamien != kamienie.end());
        if (byl) {
            kamienie.erase(kamien);
        } else {
            kamienie.insert(pole);
        }
        for (int64_t i = 0; i < pierwsze.size();++i) {
            int64_t dzielnik = pierwsze[i];
            int64_t reszta = (dzielnik <= pole) ? std::remainder(pole, dzielnik) : pole;
            if (byl) {
                int w = (wyniki[dzielnik][reszta] -= 1);
                kolejka.erase({w+1, dzielnik, reszta});
                if (w) {
                    kolejka.emplace(w, dzielnik, reszta);
                }
            } else {
                int w = (wyniki[dzielnik][reszta] += 1);
                kolejka.erase({w-1, dzielnik, reszta});
                kolejka.emplace(w, dzielnik, reszta);
            }
        }
        printf("%d\n", std::get<0>(*kolejka.rbegin()));
    }
}