code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500050,M=100050;
#define pii pair<int,int>
ll tr[N<<2],t[N<<2],a[N],k;
int n,m;
char ch;
int lowbit(int x){return x&(-x);}
void add(int x,ll y){
while(x<=n){
t[x]+=y;
x+=lowbit(x);
}
}
ll query(int x){
ll sum=0;
while(x){
sum+=t[x];
x^=lowbit(x);
}return sum;
}
void range_gcd(int ind,int l,int r){
if(l==r){
add(l,a[r]-a[l-1]);
return;
}
int mid=(l+r)/2,lf=ind<<1,rf=lf|1;
range_gcd(lf,l,mid);
range_gcd(rf,mid+1,r);
tr[ind]=__gcd(__gcd(tr[lf],tr[rf]),abs(query(mid+1)-query(mid)));
}
void range_add(int x,int l,int r,int ll,int rr){
if(l==ll&&r==rr){
add(l,k);
add(r+1,-k);
return;
}
int mid=l+r>>1,lf=x<<1,rf=lf|1;
if(rr<=mid)range_add(lf,l,mid,ll,rr);
else if(ll>mid)range_add(rf,mid+1,r,ll,rr);
else
range_add(lf,l,mid,ll,mid),
range_add(rf,mid+1,r,mid+1,rr);
tr[x]=__gcd(__gcd(tr[lf],tr[rf]),abs(query(mid+1)-query(mid)));
}
ll rgcd(int x,int l,int r,int L,int R){
if(l==L&&r==R){
return __gcd(abs(query(l)),tr[x]);
}
int mid=(l+r)/2,lf=x<<1,rf=lf|1;
if(R<=mid){
return rgcd(lf,l,mid,L,R);
}else if(L>mid)
return rgcd(rf,mid+1,r,L,R);
else
return __gcd(__gcd(rgcd(lf,l,mid,L,mid),
rgcd(rf,mid+1,r,mid+1,R)),abs(query(mid+1)-query(mid)));
}
int main(){
cin>>n>>m;
int l,r;
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
range_gcd(1,1,n);
while(m--){
cin>>ch>>l>>r;
if(ch=='C'){
cin>>k;
range_add(1,1,n,l,r);
}
else{
cout<<rgcd(1,1,n,l,r)<<endl;
}
}
}