#include <bits/stdc++.h>
 
using namespace std;
 
int a[100011];
int tree[400011];
int pf[1000011];
int v[1000011]={0};
int n,q;

void pre()
{
    long long int i;
    pf[1]=1;
    for(i=2;i<=1000000;i+=2)
    pf[i]=2;
    memset(v,0,sizeof(v));
    for(i=3;i<=1000000;i+=2)
    {
        if(!v[i])
        {
            pf[i]=i;
            for(long long int j=i; j*i <= 1000000 ; j+=2)
            {
                if(!v[j*i])
                {
                    v[j*i]=true;
                    pf[j*i]=i;
                }    
            }
        }
    }
    return;
}

void build(int node,int start,int end)
{
    if(end<start)
    return;
    if(start==end)
        {
            tree[node]=pf[a[start]];
            return;
        }
    int mid = (start+end)>>1;
    build(2*node,start,mid);
    build(2*node+1,mid+1,end);
    tree[node] = max(tree[2*node],tree[2*node+1]);
    return;
}
 
int query(int node,int start,int end,int qs,int qe)
{
    if(qe<start || qs>end)
    return 1;
    else if(start>end)
    return 1;
    else if(qs<=start && end<=qe)
    return tree[node];
    int mid = (start+end)>>1;
    int var1=1,var2=1;
    if(tree[2*node+1]!=1)
    var1 = query(2*node+1,mid+1,end,qs,qe);
    if(tree[2*node]!=1)
    var2 = query(2*node,start,mid,qs,qe);
    return max(var1,var2);
}
 
void update(int node,int start,int end,int qs,int qe)
{
    if(qe<start || qs>end)
    return;
    else if(start==end)
    {a[start]=a[start]/pf[a[start]]; tree[node]=pf[a[start]]; return;}
    int mid = (start+end)>>1;
    if(tree[2*node]!=1)
    update(2*node,start,mid,qs,qe);
    if(tree[2*node+1]!=1)
    update(2*node+1,mid+1,end,qs,qe);
    tree[node] = max(tree[2*node],tree[2*node+1]);
    return;
}
 
int main()
{
    int t;
    cin>>t;
    pre();
    while(t--)
        {
            scanf("%d %d",&n,&q);
            {
                for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
                int type,l,r;
                int res=1;
                build(1,1,n);
                while(q--)
                    {
                        scanf("%d %d %d",&type,&l,&r);
                        if(type==0)
                            {
                                update(1,1,n,l,r);
                            }
                        else
                            {
                                printf("%d ",query(1,1,n,l,r));
                            }
                    }
            }
            printf("\n");
        }
    return 0;
}