The below code gives a bad alloc error and I can’t figure out why, could someone please help;
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define vii vector<pii>
#define mi map<int,int>
#define mii map<pii,int>
#define endl '\n'
#define hell 1000000007
#define rep(i,a,b) for(int i=a;i<b;i++)
#define repr(i,a,b) for(int i=a;i>=b;i--)
#define int long long
#define sz(x) (int)x.size()
#define mp make_pair
#define fi first
#define se second
#define io ios_base::sync_with_stdio(false),cin.tie(NULL)
using namespace std;
#define INF 1e7
#define MAX 1000005
int spf[MAX];
int f[MAX];
// function to find smallest prime factor
void sieve()
{
spf[1] = 1;
for(int i=2;i<MAX;i++)
{
spf[i] = i;
}
for(int j=4;j<MAX;j+=2)
spf[j]=2;
for(int i=3;i*i<MAX;i++)
{
if(spf[i]==i)
{
for(int j=i*i;j<MAX;j+=i)
if(spf[j]==j)
spf[j]=i;
}
}
}
int res(vi& a,int n,vi v[])
{
memset(f,-1,sizeof(f));
rep(i,0,n)
{
while(a[i]>1)
{
int val = spf[a[i]];
a[i] = a[i]/val;
v[i].pb(val); // stores all the prime factor of a number in the vector
}
}
int l=0,r=1,ans =-1; // using two pointers to include and exclude elements
for(auto it:v[0])
{
f[it]=0;
}
while(l<=r&&r<n)
{
int flag=0;
rep(i,0,v[r].size())
{
if(f[v[r][i]]==-1||f[v[r][i]]==r)
{
f[v[r][i]]=r;
}
else
{
flag=1;
break;
}
}
if(flag==1)
{
for(auto it:v[l])
{
f[it]=-1;
}
l++;
}
else
{
ans = max(ans,r-l+1);
r++;
}
}
if(ans==1) ans = -1;
return ans;
}
signed main()
{
io;
sieve();
int t;
cin >>t;
while(t--)
{
int n;
cin >> n;
vi a(n);
rep(i,0,n)
{
cin >> a[i];
}
vi v[n];
cout << res(a,n,v)<<endl;
}
}