#include <bits/stdc++.h>
using namespace std;
int MAX = 1000000;
long long int tree[4*1000000];
long long int leastprime[1000000+1];
void start(){
for(int i=0;i<=1000000;i++){
leastprime[i]=i;
}
for(int i=2;i<=sqrt(1000000);i++){
for(int j=i;j<=1000000;j+=i){
if(leastprime[j]>i){
leastprime[j]=i;
}
}
}
leastprime[0]=1;leastprime[1]=1;
}
int build(int left , int right , int current,int arr[]){
if(left>right){
return 0;
}
if(left==right){
tree[current]=leastprime[arr[left]];
return tree[current];
}
int mid=(left+right)/2;
int a = build(left , mid , (2*current)+1 , arr );
int b = build(mid+1 , right , (2*current)+2 , arr );
tree[current] = a>b?a:b;
return tree[current];
/*
2 5 8 10 3 44
2 5 2 2 3 2
0 => 5 (0,5)
1 => 5 (0,2)
2 => 3 (3,5)
3 => 5 (0,1)
4 => 2 (2,2)
5 => 3 (3,4)
6 => 2 (5,5)
7 => 2 (0,0)
8 => 5 (1,1)
9
10
11 => 2 (3,3)
12 => 3 (4,4)
*/
}
void print(int current){
for(int i=0;i<current;i++){
std::cout << tree[i] << " ";
}
}
int update(int left , int right , int cleft , int cright , int current,int arr[]){
if(cleft>cright){
return 0;
}
if(cright<left || right<cleft){
return 0;
}
if(tree[current]==1){
return 0;
}
if(cleft==cright){
if(cleft>=left && cleft<=right){
arr[cleft] = arr[cleft]/leastprime[arr[cleft]];
tree[current] = leastprime[arr[cleft]];
return tree[current];
}
else{
return 0;
}
}
int mid = (cleft+cright)/2;
int a = update(left,right,cleft,mid,(2*current)+1,arr);
int b = update(left,right,mid+1,cright,(2*current)+2,arr);
tree[current] = a>b?a:b;
return tree[current];
}
int find(int left , int right , int cleft , int cright , int current){
if(cright<left || right<cleft){
return 0;
}
if(cleft==cright){
if(cleft>=left && cleft<=right){
return tree[cleft];
}
else{
return 0;
}
}
if(cleft>=left&&cright<=right){
return tree[current];
}
int mid=(cleft+cright)/2;
int a = find(left,right,cleft,mid,(2*current)+1);
int b = find(left,right,mid+1,cright,(2*current)+2);
return a>b?a:b;
}
int main(){
start();
int t;std::cin >> t;
while(t--){
int n,m;std::cin >> n>>m;
int arr[n];
for(int i=0;i<n;i++){
std::cin >> arr[i];
}
int jk=build(0,n-1,0,arr);
while(m--){
int l,r,type;std::cin >> type>>l>>r;
if(type==0){
// UPDATE
int p =update(l-1,r-1,0,n-1,0,arr);
}
else{
//FIND
std::cout << find(l-1,r-1,0,n-1,0) <<" ";
if(m==0){
cout<<"\n";
}
}
}
}
}
plz some one tell me where i am getting mistake , plz