#include <bits/stdc++.h>
using namespace std;
bitset<10000005> a;
int cnt[3165][3165];
int freq[3165][3165];
int freon[3165];
vector<int> ac;
int pos[10000005];
vector<int> minos;
bool syzyf[3165];
void siro(int l)
{
for(int i=2; i<=l; i++) syzyf[i]=true;
for(int p=2; p*p<=l; p++)
{
if(syzyf[p])
{
for(int i=p*p; i<=l; i+=p) syzyf[i]=false;
}
}
for(int p=2; p<=l; p++) if(syzyf[p]) minos.push_back(p);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,q;
cin>>n>>q;
int pierw=sqrt(n);
if(pierw<2) pierw=2;
if(pierw>3162) pierw=3162;
siro(pierw);
for(int i:minos) {
freq[i][0]=i;
freon[i]=0;
}
int yep=0;
for(int i=0; i<q; ++i)
{
int x;
cin>>x;
bool plus=!a[x];
a[x]=!a[x];
if(plus)
{
pos[x]=ac.size();
ac.push_back(x);
yep++;
}
else
{
yep--;
int p=pos[x];
int last_val=ac.back();
ac[p]=last_val;
pos[last_val]=p;
ac.pop_back();
}
int m1=0;
for(int i:minos)
{
int r=x%i;
int temp=plus?(cnt[i][r]+1):(cnt[i][r]-1);
freq[i][cnt[i][r]]--;
cnt[i][r]=temp;
freq[i][temp]++;
if(plus&&temp>freon[i])
{
freon[i]=temp;
}
else if(!plus&&cnt[i][r]+1==freon[i]&&freq[i][freon[i]]==0)
{
freon[i]--;
}
if(freon[i]>m1) m1=freon[i];
}
int ans=m1;
if(yep>ans)
{
int m2=0;
if(yep>0) m2=1;
vector<int> ac2=ac;
sort(ac2.begin(),ac2.end());
int roz=ac2.size();
for(int i=0; i<roz; i++)
{
for(int j=i+1; j<roz; j++)
{
int diff=ac2[j]-ac2[i];
if(diff<=pierw) continue;
int len=0,curr=ac2[i];
while(curr<=n&&a[curr])
{
len++;
curr+=diff;
}
curr=ac2[i]-diff;
while(curr>=1&&a[curr])
{
len++;
curr-=diff;
}
if(len>m2) m2=len;
}
}
if(m2>ans) ans=m2;
}
cout<<ans<<"\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 | #include <bits/stdc++.h> using namespace std; bitset<10000005> a; int cnt[3165][3165]; int freq[3165][3165]; int freon[3165]; vector<int> ac; int pos[10000005]; vector<int> minos; bool syzyf[3165]; void siro(int l) { for(int i=2; i<=l; i++) syzyf[i]=true; for(int p=2; p*p<=l; p++) { if(syzyf[p]) { for(int i=p*p; i<=l; i+=p) syzyf[i]=false; } } for(int p=2; p<=l; p++) if(syzyf[p]) minos.push_back(p); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n,q; cin>>n>>q; int pierw=sqrt(n); if(pierw<2) pierw=2; if(pierw>3162) pierw=3162; siro(pierw); for(int i:minos) { freq[i][0]=i; freon[i]=0; } int yep=0; for(int i=0; i<q; ++i) { int x; cin>>x; bool plus=!a[x]; a[x]=!a[x]; if(plus) { pos[x]=ac.size(); ac.push_back(x); yep++; } else { yep--; int p=pos[x]; int last_val=ac.back(); ac[p]=last_val; pos[last_val]=p; ac.pop_back(); } int m1=0; for(int i:minos) { int r=x%i; int temp=plus?(cnt[i][r]+1):(cnt[i][r]-1); freq[i][cnt[i][r]]--; cnt[i][r]=temp; freq[i][temp]++; if(plus&&temp>freon[i]) { freon[i]=temp; } else if(!plus&&cnt[i][r]+1==freon[i]&&freq[i][freon[i]]==0) { freon[i]--; } if(freon[i]>m1) m1=freon[i]; } int ans=m1; if(yep>ans) { int m2=0; if(yep>0) m2=1; vector<int> ac2=ac; sort(ac2.begin(),ac2.end()); int roz=ac2.size(); for(int i=0; i<roz; i++) { for(int j=i+1; j<roz; j++) { int diff=ac2[j]-ac2[i]; if(diff<=pierw) continue; int len=0,curr=ac2[i]; while(curr<=n&&a[curr]) { len++; curr+=diff; } curr=ac2[i]-diff; while(curr>=1&&a[curr]) { len++; curr-=diff; } if(len>m2) m2=len; } } if(m2>ans) ans=m2; } cout<<ans<<"\n"; } } |
English