#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
mt19937 gen(676767);
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, q;
cin >> n >> q;
vector<int> P(n+1);
for(int i = 2; i <= n; i++){
if(P[i] != 0) continue;
for(int j = i; j <= n; j += i){
P[j] = i;
}
}
const int SQ = 100;
unordered_map<int,int> gdzieJest;
vector<int> elementy;
vector<vector<int>> pierwsze;
vector<int> pos(n+1);
for(int i = 2; pierwsze.size() < SQ && i <= n; i++){
if(P[i]==i){
pos[i] = pierwsze.size();
pierwsze.push_back(vector<int>(i));
}
}
const int MAX_P = pierwsze[pierwsze.size()-1].size();
// cout << MAX_P << endl;
auto wyn = [&](int p, int a){
int cnt = 0;
int wzor = a%p;
for(int x : elementy){
if(x%p == wzor)cnt++;
}
// cout <<p << " " << a << "XD "<<cnt<<endl;
return cnt;
};
for(int i = 0; i < q; i++){
// if(i%1000==0)cerr<<i<<endl;
int a;
cin >> a;
int add;
if(gdzieJest.find(a) != gdzieJest.end() && gdzieJest[a] != -1){
int ind = gdzieJest[a];
gdzieJest[elementy[elementy.size()-1]] = ind;
gdzieJest[a] = -1;
swap(elementy[ind], elementy[elementy.size()-1]);
elementy.pop_back();
add = -1;
}else{
elementy.push_back(a);
gdzieJest[a] = elementy.size()-1;
add = 1;
}
for(int i = 0; i < pierwsze.size(); i++){
pierwsze[i][a%pierwsze[i].size()]+=add;
}
if(elementy.size() <= 1){
cout << elementy.size() << '\n';
continue;
}
if(elementy.size() == 2){
if(abs(elementy[0]-elementy[1])<=1)cout << 1 << '\n';
else cout << 2 << '\n';
continue;
}
int naj = 0;
// if(MAX_P * elementy.size() > 2*n){
// cout << naj << '\n';
// continue;
// }
int cnt = 40;
while(cnt--){
int a = gen()%elementy.size();
int b = gen()%elementy.size();
int d = abs(elementy[a] - elementy[b]);
if(d <= 1) continue;
while(P[d] > 1){
int dziel = P[d];
if(dziel <= (2*n)/elementy.size()+7){
if(dziel > MAX_P){naj = max(naj, wyn(dziel, elementy[a]));}
else naj = max(naj, pierwsze[pos[dziel]][elementy[a]%dziel]);
}
while(d % dziel == 0) d /= dziel;
}
}
cout << naj << '\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 | #include <bits/stdc++.h> typedef long long ll; using namespace std; mt19937 gen(676767); int main(){ cin.tie(0)->sync_with_stdio(0); int n, q; cin >> n >> q; vector<int> P(n+1); for(int i = 2; i <= n; i++){ if(P[i] != 0) continue; for(int j = i; j <= n; j += i){ P[j] = i; } } const int SQ = 100; unordered_map<int,int> gdzieJest; vector<int> elementy; vector<vector<int>> pierwsze; vector<int> pos(n+1); for(int i = 2; pierwsze.size() < SQ && i <= n; i++){ if(P[i]==i){ pos[i] = pierwsze.size(); pierwsze.push_back(vector<int>(i)); } } const int MAX_P = pierwsze[pierwsze.size()-1].size(); // cout << MAX_P << endl; auto wyn = [&](int p, int a){ int cnt = 0; int wzor = a%p; for(int x : elementy){ if(x%p == wzor)cnt++; } // cout <<p << " " << a << "XD "<<cnt<<endl; return cnt; }; for(int i = 0; i < q; i++){ // if(i%1000==0)cerr<<i<<endl; int a; cin >> a; int add; if(gdzieJest.find(a) != gdzieJest.end() && gdzieJest[a] != -1){ int ind = gdzieJest[a]; gdzieJest[elementy[elementy.size()-1]] = ind; gdzieJest[a] = -1; swap(elementy[ind], elementy[elementy.size()-1]); elementy.pop_back(); add = -1; }else{ elementy.push_back(a); gdzieJest[a] = elementy.size()-1; add = 1; } for(int i = 0; i < pierwsze.size(); i++){ pierwsze[i][a%pierwsze[i].size()]+=add; } if(elementy.size() <= 1){ cout << elementy.size() << '\n'; continue; } if(elementy.size() == 2){ if(abs(elementy[0]-elementy[1])<=1)cout << 1 << '\n'; else cout << 2 << '\n'; continue; } int naj = 0; // if(MAX_P * elementy.size() > 2*n){ // cout << naj << '\n'; // continue; // } int cnt = 40; while(cnt--){ int a = gen()%elementy.size(); int b = gen()%elementy.size(); int d = abs(elementy[a] - elementy[b]); if(d <= 1) continue; while(P[d] > 1){ int dziel = P[d]; if(dziel <= (2*n)/elementy.size()+7){ if(dziel > MAX_P){naj = max(naj, wyn(dziel, elementy[a]));} else naj = max(naj, pierwsze[pos[dziel]][elementy[a]%dziel]); } while(d % dziel == 0) d /= dziel; } } cout << naj << '\n'; } return 0; } |
English