#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()));
}
}
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())); } } |
English