#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; }