#include<cstdio>
#include<cstring>
#include<algorithm>
const int M=1e5+7;
int read(){
int ans=0,f=1,c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
return ans*f;
}
int n,m,p;
int N,g[3*M],bit[M],h[M];
int gcd(int x,int y){
while(y){p=x%y; x=y; y=p;}
return x;
}
void tr_modify(int x,int v){
g[x+=N]+=v;
for(x>>=1;x;x>>=1) g[x]=gcd(g[x<<1],g[x<<1^1]);
}
#define lowbit(x) x&-x
int s[M];
void bit_insert(int x,int v){
while(x<=n){
s[x]+=v;
x+=lowbit(x);
}
}
int bit_query(int x){
int ans=h[x];
while(x) ans+=s[x],x-=lowbit(x);
return ans;
}
void modify(int l,int r,int v){
bit_insert(l,v); tr_modify(l-1,-v);
bit_insert(r+1,-v); tr_modify(r,v);
}
int push_ans(int l,int r){
int ans=bit_query(r);
for(l=l+N-1,r=r+N;r-l!=1;l>>=1,r>>=1){
if(~l&1) ans=gcd(ans,g[l^1]);
if(r&1) ans=gcd(ans,g[r^1]);
}
if(ans<0) ans=-ans;
return ans;
}
void pd(int &x,int &y){if(x>y) std::swap(x,y);}
int main(){
int k,l,r,v;
n=read(); m=read();
for(int i=1;i<=n;i++) h[i]=read();
for(N=1;N<=n+5;N<<=1);
for(int i=1;i<n;i++) g[i+N]=h[i]-h[i+1];
for(int i=N-1;i;i--) g[i]=gcd(g[i<<1],g[i<<1^1]);
for(int i=1;i<=m;i++){
k=read();
if(k==1) l=read(),r=read(),pd(l,r),printf("%d\n",push_ans(l,r));
else l=read(),r=read(),v=read(),pd(l,r),modify(l,r,v);
}
return 0;
}