#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int B = 1500;
int cnt_data[2000000];
int* cnt[B + 2];
int freq[100005];
int A[100005];
int last_que[100005];
int last_chk[100005];
void brut(int n, int q){
vector<bool>memo(n+1, 0);
while(q-->0){
int x; cin >> x;
memo[x] = !memo[x];
int maxi = 0;
for(int k=2; n>=k; k++){
for(int s=1; k>=s; s++){
int curr = 0;
for(int pos = s; n>=pos; pos += k){
if(memo[pos]){
curr++;
}
}
if(curr > maxi){
maxi = curr;
}
}
}
cout<<maxi<<'\n';
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, q;
cin>>n>>q;
if(n <= 2000 and q <= 2000){
brut(n,q);
return 0;
}
int offset = 0;
for(int i=2; B>=i; i++){
cnt[i] = cnt_data + offset;
offset += i;
freq[0] += i;
}
int maxi = 0;
set<int> memo;
for(int xd = 1; q>=xd; xd++){
int x; cin>>x;
int delta = (A[x] == 0) ? 1 : -1;
A[x] = (A[x] == 0) ? 1 : 0;
if(delta == 1) memo.insert(x);
else memo.erase(x);
for(int i=2; min(n, B)>=i; i++){
int r = x % i;
int c = cnt[i][r];
freq[c]--;
c += delta;
cnt[i][r] = c;
freq[c]++;
if(delta == 1 and c > maxi){
maxi = c;
}
}
if(delta == -1){
while(maxi > 0 and freq[maxi] == 0){
maxi--;
}
}
int max_l = maxi;
int limit = n / B + 1;
if(max_l < limit){
vector<int>P(memo.begin(), memo.end());
int S_val = P.size();
for(int i=0; S_val>i; i++){
for(int j=i+1; S_val>j; j++){
int D = P[j] - P[i];
for(int m=1; D>m*B; m++){
if(D % m == 0){
int K = D / m;
if(K <= B) continue;
int r = P[i] % K;
if(last_que[K] == xd and last_chk[K] == r) continue;
last_que[K] = xd;
last_chk[K] = r;
int start = r;
if(start == 0) start += K;
int c = 0;
for(int nxt = start; n>=nxt; nxt += K){
if(A[nxt]) c++;
}
if(c > max_l) max_l = c;
}
}
}
}
}
cout << max_l << '\n';
}
}
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 | #include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; const int B = 1500; int cnt_data[2000000]; int* cnt[B + 2]; int freq[100005]; int A[100005]; int last_que[100005]; int last_chk[100005]; void brut(int n, int q){ vector<bool>memo(n+1, 0); while(q-->0){ int x; cin >> x; memo[x] = !memo[x]; int maxi = 0; for(int k=2; n>=k; k++){ for(int s=1; k>=s; s++){ int curr = 0; for(int pos = s; n>=pos; pos += k){ if(memo[pos]){ curr++; } } if(curr > maxi){ maxi = curr; } } } cout<<maxi<<'\n'; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin>>n>>q; if(n <= 2000 and q <= 2000){ brut(n,q); return 0; } int offset = 0; for(int i=2; B>=i; i++){ cnt[i] = cnt_data + offset; offset += i; freq[0] += i; } int maxi = 0; set<int> memo; for(int xd = 1; q>=xd; xd++){ int x; cin>>x; int delta = (A[x] == 0) ? 1 : -1; A[x] = (A[x] == 0) ? 1 : 0; if(delta == 1) memo.insert(x); else memo.erase(x); for(int i=2; min(n, B)>=i; i++){ int r = x % i; int c = cnt[i][r]; freq[c]--; c += delta; cnt[i][r] = c; freq[c]++; if(delta == 1 and c > maxi){ maxi = c; } } if(delta == -1){ while(maxi > 0 and freq[maxi] == 0){ maxi--; } } int max_l = maxi; int limit = n / B + 1; if(max_l < limit){ vector<int>P(memo.begin(), memo.end()); int S_val = P.size(); for(int i=0; S_val>i; i++){ for(int j=i+1; S_val>j; j++){ int D = P[j] - P[i]; for(int m=1; D>m*B; m++){ if(D % m == 0){ int K = D / m; if(K <= B) continue; int r = P[i] % K; if(last_que[K] == xd and last_chk[K] == r) continue; last_que[K] = xd; last_chk[K] = r; int start = r; if(start == 0) start += K; int c = 0; for(int nxt = start; n>=nxt; nxt += K){ if(A[nxt]) c++; } if(c > max_l) max_l = c; } } } } } cout << max_l << '\n'; } } |
English