#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
const int N=1e7;
static bool ip[N+1];
vector<int> p;
mt19937 rng(556366);
class dynamic_array{
private:
vector<int> a,p;
public:
dynamic_array(int V):p(V,-1){}
bool op(int x){
if(~p[x]){
p[a.back()]=p[x];
swap(a[p[x]],a.back()),a.pop_back();
return p[x]=-1,false;
}
p[x]=a.size(),a.emplace_back(x);
return true;
}
int size(){return a.size();}
int pick(){return a[rng()%a.size()];}
vector<int> get_array(){return a;}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,q; cin>>n>>q;
if(n==1){
int c=0;
while(q--){
int x; cin>>x;
cout<<(c^=1)<<'\n';
}
return 0;
}
const int B=min(max((int)sqrt(n*2),50),min(n,3500));
vector<int> mp(n+1);
for(int i=1;i<=n;i++)
ip[i]=true;
for(int i=2;i<=n;i++)
if(ip[i]){
if(i<=B)p.emplace_back(i);
else mp[i]=i;
for(int j=i*2;j<=n;j+=i)
if(ip[j]=false;i>B)mp[j]=i;
}
vector<vector<int> > a(p.size());
for(int i=0;i<p.size();i++)
a[i].resize(p[i]);
vector<int> ma(q+1);
int mx=0;
auto add=[&](int c){
mx=max(mx,c+1);
ma[c]--,ma[c+1]++;
};
auto del=[&](int c){
ma[c]--,ma[c-1]++;
if(mx==c&&!ma[c])mx--;
};
dynamic_array da(n);
vector<int> ct(n),ts(n);
int tm=0;
while(q--){
int x; cin>>x;
bool f=da.op(--x);
for(int i=0;i<p.size();i++){
if(f)add(a[i][x%p[i]]++);
else del(a[i][x%p[i]]--);
}
int rs=mx;
if(1ll*mx*(B+1)<=n&&da.size()>1){
gp_hash_table<int,int> tb;
for(int r=0;r<100;r++){
int x=da.pick(),y=da.pick();
int d=mp[abs(x-y)];
if(d&&d<=n/mx)tb[d]++;
}
vector<int> vp;
for(auto [p,c]:tb)
if(c>=3)vp.emplace_back(p);
if(!vp.empty()){
auto v=da.get_array();
for(int p:vp){
if(1ll*p*rs>n)continue;
tm++;
for(int i:v){
int r=i%p;
if(ts[r]!=tm)ts[r]=tm,ct[r]=0;
rs=max(rs,++ct[r]);
}
}
}
}
cout<<rs<<'\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 | #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/hash_policy.hpp> using namespace std; using namespace __gnu_pbds; const int N=1e7; static bool ip[N+1]; vector<int> p; mt19937 rng(556366); class dynamic_array{ private: vector<int> a,p; public: dynamic_array(int V):p(V,-1){} bool op(int x){ if(~p[x]){ p[a.back()]=p[x]; swap(a[p[x]],a.back()),a.pop_back(); return p[x]=-1,false; } p[x]=a.size(),a.emplace_back(x); return true; } int size(){return a.size();} int pick(){return a[rng()%a.size()];} vector<int> get_array(){return a;} }; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; if(n==1){ int c=0; while(q--){ int x; cin>>x; cout<<(c^=1)<<'\n'; } return 0; } const int B=min(max((int)sqrt(n*2),50),min(n,3500)); vector<int> mp(n+1); for(int i=1;i<=n;i++) ip[i]=true; for(int i=2;i<=n;i++) if(ip[i]){ if(i<=B)p.emplace_back(i); else mp[i]=i; for(int j=i*2;j<=n;j+=i) if(ip[j]=false;i>B)mp[j]=i; } vector<vector<int> > a(p.size()); for(int i=0;i<p.size();i++) a[i].resize(p[i]); vector<int> ma(q+1); int mx=0; auto add=[&](int c){ mx=max(mx,c+1); ma[c]--,ma[c+1]++; }; auto del=[&](int c){ ma[c]--,ma[c-1]++; if(mx==c&&!ma[c])mx--; }; dynamic_array da(n); vector<int> ct(n),ts(n); int tm=0; while(q--){ int x; cin>>x; bool f=da.op(--x); for(int i=0;i<p.size();i++){ if(f)add(a[i][x%p[i]]++); else del(a[i][x%p[i]]--); } int rs=mx; if(1ll*mx*(B+1)<=n&&da.size()>1){ gp_hash_table<int,int> tb; for(int r=0;r<100;r++){ int x=da.pick(),y=da.pick(); int d=mp[abs(x-y)]; if(d&&d<=n/mx)tb[d]++; } vector<int> vp; for(auto [p,c]:tb) if(c>=3)vp.emplace_back(p); if(!vp.empty()){ auto v=da.get_array(); for(int p:vp){ if(1ll*p*rs>n)continue; tm++; for(int i:v){ int r=i%p; if(ts[r]!=tm)ts[r]=tm,ct[r]=0; rs=max(rs,++ct[r]); } } } } cout<<rs<<'\n'; } return 0; } |
English