#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
using LL = long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q, a;
cin >> n >> q;
vector<int> primes;
vector<bool> tmp(n);
for (int i = 2; i < (n + 1) / 2; i++)
{
if (!tmp[i])
{
primes.push_back(i);
for (int j = i + i; j < n; j += i)
{
tmp[j] = true;
}
}
}
if (primes.size() == 0)
primes.push_back(2);
vector<bool> stones(n + 1);
vector<int> stonesInd(n + 1);
vector<int> stonesPos;
vector<int> mods(n + 10);
vector<int> used(n + 10);
for (int t = 0; t < q; ++t)
{
cin >> a;
if (stones[a])
{
int ind = stonesInd[a];
stonesPos[ind] = stonesPos.back();
stonesInd[stonesPos[ind]] = ind;
stonesPos.pop_back();
}
else
{
stonesInd[a] = stonesPos.size();
stonesPos.push_back(a);
}
stones[a] = !stones[a];
if (stonesPos.size() < 2)
{
cout << stonesPos.size() << "\n";
continue;
}
else if (stonesPos.size() == 2)
{
cout << (abs(stonesPos[0] - stonesPos[1] == 1) ? 1 : 2) << "\n";
continue;
}
int res = (stonesPos.size() + 1) / 2;
for (int i = 0; i < primes.size(); ++i)
{
int prime = primes[i];
if ((LL)res * prime > n)
break;
int mx = 0;
int ucnt = 0;
for (int i = 0; i < stonesPos.size(); ++i)
{
int m = stonesPos[i] % prime;
mx = max(mx, ++mods[m]);
if (mods[m] == 1)
used[ucnt++] = m;
if (mx + stonesPos.size() - 1 - i <= res)
break;
}
for (int i = 0; i < ucnt; ++i)
{
mods[used[i]] = 0;
}
res = max(res, mx);
}
cout << res << "\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 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 | #include <algorithm> #include <cmath> #include <iostream> #include <vector> using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q, a; cin >> n >> q; vector<int> primes; vector<bool> tmp(n); for (int i = 2; i < (n + 1) / 2; i++) { if (!tmp[i]) { primes.push_back(i); for (int j = i + i; j < n; j += i) { tmp[j] = true; } } } if (primes.size() == 0) primes.push_back(2); vector<bool> stones(n + 1); vector<int> stonesInd(n + 1); vector<int> stonesPos; vector<int> mods(n + 10); vector<int> used(n + 10); for (int t = 0; t < q; ++t) { cin >> a; if (stones[a]) { int ind = stonesInd[a]; stonesPos[ind] = stonesPos.back(); stonesInd[stonesPos[ind]] = ind; stonesPos.pop_back(); } else { stonesInd[a] = stonesPos.size(); stonesPos.push_back(a); } stones[a] = !stones[a]; if (stonesPos.size() < 2) { cout << stonesPos.size() << "\n"; continue; } else if (stonesPos.size() == 2) { cout << (abs(stonesPos[0] - stonesPos[1] == 1) ? 1 : 2) << "\n"; continue; } int res = (stonesPos.size() + 1) / 2; for (int i = 0; i < primes.size(); ++i) { int prime = primes[i]; if ((LL)res * prime > n) break; int mx = 0; int ucnt = 0; for (int i = 0; i < stonesPos.size(); ++i) { int m = stonesPos[i] % prime; mx = max(mx, ++mods[m]); if (mods[m] == 1) used[ucnt++] = m; if (mx + stonesPos.size() - 1 - i <= res) break; } for (int i = 0; i < ucnt; ++i) { mods[used[i]] = 0; } res = max(res, mx); } cout << res << "\n"; } return 0; } |
English