#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<vector>
#include<set>
#include<cstdlib>
#define N 10000005
#define SQRT_N 3162
using namespace std;
bool lp[N];
vector<long long> pierwsze;
bool kamyki[N];
set<long long> obecne_kamyki;
//https://algorytmy.oki.org.pl/sito.html
void SitoEratostenesa() {
int i;
int maxi = SQRT_N;
lp[0] = true;
lp[1] = true;
for (i = 2; i < maxi; i++) {
if (lp[i]) {
continue;
}
for (int j = i * i; j < N; j += i) {
lp[j] = 1;
}
}
}
long long sprawdz_2(long long p) {
//printf("sprawdzam p = %lld\n", p);
vector<long long> licznik(p, 0);
for (long long kamyk : obecne_kamyki) {
licznik[kamyk % p]++;
}
long long result = 0;
for (long long i = 0; i < p; i++) {
result = max(licznik[i], result);
}
return result;
}
int main() {
SitoEratostenesa();
for (int i = 0; i < N; i++) {
if (!lp[i]) {
pierwsze.push_back(i);
}
}
//printf("%lld\n", pierwsze.size());
long long n, q;
scanf("%lld %lld", &n, &q);
long long aktualne_d = 0;
long long aktualny_wynik = 0;
bool dodano = false;
for (long long i = 0; i < q; i++) {
long long a;
scanf("%lld", &a);
if (kamyki[a]) {
//usuniecie
dodano = false;
kamyki[a] = false;
aktualne_d--;
obecne_kamyki.erase(a);
}
else {
//dodanie
dodano = true;
kamyki[a] = true;
aktualne_d++;
obecne_kamyki.insert(a);
}
if (aktualne_d == 0) {
aktualny_wynik = 0;
printf("0\n");
}
else if (aktualne_d == 1) {
aktualny_wynik = 1;
printf("1\n");
}
else if (aktualne_d == 2) {
auto it = obecne_kamyki.begin();
long long a = *it;
++it;
long long b = *it;
if (abs(a - b) == 1) {
aktualny_wynik = 1;
printf("1\n");
}
else {
aktualny_wynik = 2;
printf("2\n");
}
}
else {
long long result = 0L;
for (long long p : pierwsze) {
if (p <= 2 * n / aktualne_d) {
result = max(result, sprawdz_2(p));
if (dodano && result > aktualny_wynik) {
break;
}
if (!dodano && result >= aktualny_wynik) {
break;
}
}
else {
break;
}
}
aktualny_wynik = result;
printf("%lld\n", result);
}
}
return 0;
}
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<vector> #include<set> #include<cstdlib> #define N 10000005 #define SQRT_N 3162 using namespace std; bool lp[N]; vector<long long> pierwsze; bool kamyki[N]; set<long long> obecne_kamyki; //https://algorytmy.oki.org.pl/sito.html void SitoEratostenesa() { int i; int maxi = SQRT_N; lp[0] = true; lp[1] = true; for (i = 2; i < maxi; i++) { if (lp[i]) { continue; } for (int j = i * i; j < N; j += i) { lp[j] = 1; } } } long long sprawdz_2(long long p) { //printf("sprawdzam p = %lld\n", p); vector<long long> licznik(p, 0); for (long long kamyk : obecne_kamyki) { licznik[kamyk % p]++; } long long result = 0; for (long long i = 0; i < p; i++) { result = max(licznik[i], result); } return result; } int main() { SitoEratostenesa(); for (int i = 0; i < N; i++) { if (!lp[i]) { pierwsze.push_back(i); } } //printf("%lld\n", pierwsze.size()); long long n, q; scanf("%lld %lld", &n, &q); long long aktualne_d = 0; long long aktualny_wynik = 0; bool dodano = false; for (long long i = 0; i < q; i++) { long long a; scanf("%lld", &a); if (kamyki[a]) { //usuniecie dodano = false; kamyki[a] = false; aktualne_d--; obecne_kamyki.erase(a); } else { //dodanie dodano = true; kamyki[a] = true; aktualne_d++; obecne_kamyki.insert(a); } if (aktualne_d == 0) { aktualny_wynik = 0; printf("0\n"); } else if (aktualne_d == 1) { aktualny_wynik = 1; printf("1\n"); } else if (aktualne_d == 2) { auto it = obecne_kamyki.begin(); long long a = *it; ++it; long long b = *it; if (abs(a - b) == 1) { aktualny_wynik = 1; printf("1\n"); } else { aktualny_wynik = 2; printf("2\n"); } } else { long long result = 0L; for (long long p : pierwsze) { if (p <= 2 * n / aktualne_d) { result = max(result, sprawdz_2(p)); if (dodano && result > aktualny_wynik) { break; } if (!dodano && result >= aktualny_wynik) { break; } } else { break; } } aktualny_wynik = result; printf("%lld\n", result); } } return 0; } |
English