// Author: Bartek Knapik
#include <cstdio>
#include <unordered_set>
#include <unordered_map>
#include <vector>
using namespace std;
int n, q, s;
unordered_set<int> stones;
const int MAX_N = 10000000+9;
vector<bool> is_prime(MAX_N, true);
vector<int> primes;
int counter[MAX_N];
int answer(int max_n)
{
int res, d, p;
d = stones.size();
if (d < 3)
return d;
res = d / 2;
for (int i = 0; res * primes[i] <= max_n; ++i)
{
p = primes[i];
for (int j = 0; j < p; ++j)
counter[j] = 0;
for (int stone: stones)
{
int pos = stone % p;
counter[pos]++;
if (counter[pos] > res)
res = counter[pos];
}
}
return res;
}
int main()
{
int max_n;
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= MAX_N; i++)
if (is_prime[i])
for (int j = i * i; j <= MAX_N; j += i)
is_prime[j] = false;
for (int i = 2; i <= MAX_N; ++i)
if (is_prime[i])
primes.push_back(i);
scanf("%d%d", &n, &q);
stones.clear();
max_n = 0;
for (int i = 0; i < q; ++i)
{
scanf("%d", &s);
max_n = max_n < s ? s : max_n;
if (stones.count(s))
stones.erase(s);
else
stones.insert(s);
printf("%d\n", answer(max_n));
}
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 | // Author: Bartek Knapik #include <cstdio> #include <unordered_set> #include <unordered_map> #include <vector> using namespace std; int n, q, s; unordered_set<int> stones; const int MAX_N = 10000000+9; vector<bool> is_prime(MAX_N, true); vector<int> primes; int counter[MAX_N]; int answer(int max_n) { int res, d, p; d = stones.size(); if (d < 3) return d; res = d / 2; for (int i = 0; res * primes[i] <= max_n; ++i) { p = primes[i]; for (int j = 0; j < p; ++j) counter[j] = 0; for (int stone: stones) { int pos = stone % p; counter[pos]++; if (counter[pos] > res) res = counter[pos]; } } return res; } int main() { int max_n; is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= MAX_N; i++) if (is_prime[i]) for (int j = i * i; j <= MAX_N; j += i) is_prime[j] = false; for (int i = 2; i <= MAX_N; ++i) if (is_prime[i]) primes.push_back(i); scanf("%d%d", &n, &q); stones.clear(); max_n = 0; for (int i = 0; i < q; ++i) { scanf("%d", &s); max_n = max_n < s ? s : max_n; if (stones.count(s)) stones.erase(s); else stones.insert(s); printf("%d\n", answer(max_n)); } return 0; } |
English