0pts玄关
#include<bits/stdc++.h>
#pragma GCC Optimize(3)
#define int long long
using namespace std;
struct node{
int l,r,gcd,num;
}tree[5000005];
int a[500005];
int n,m;
void pushup(int cur){
tree[cur].num = tree[cur * 2].num + tree[cur * 2 + 1].num;
tree[cur].gcd = __gcd(tree[cur * 2].gcd,tree[cur * 2 + 1].gcd);
}
void build(int l,int r,int cur){
tree[cur].l = l;
tree[cur].r = r;
if(l == r){
tree[cur].num = tree[cur].gcd = a[l] - a[l - 1];
return;
}
int mid = (l + r) >> 1;
build(l,mid,cur * 2);
build(mid + 1,r,cur * 2 + 1);
pushup(cur);
}
void change(int cur,int l,int k){
if(tree[cur].l > l || tree[cur].r < l) return;
if(tree[cur].l == l && tree[cur].r == l){
tree[cur].gcd += k;
tree[cur].num += k;
return;
}
change(cur * 2,l,k);
change(cur * 2 + 1,l,k);
pushup(cur);
}
int query(int cur,int l,int r){
if(tree[cur].l > r || tree[cur].r < l) return 0;
if(tree[cur].l >= l && tree[cur].r <= r) return abs(tree[cur].gcd);
return __gcd(query(cur * 2,l,r),query(cur * 2 + 1,l,r));
}
int sum(int cur,int l,int r){
if(tree[cur].l > r || tree[cur].r < l) return 0;
if(tree[cur].l >= l && tree[cur].r <= r) return abs(tree[cur].num);
return sum(cur * 2,l,r) + sum(cur * 2 + 1,l,r);
}
signed main(){
cin >> n >> m;
a[0] = 0;
for(int i = 1;i <= n;i++) cin >> a[i];
build(1,n,1);
while(m--){
char op; cin >> op;
if(op == 'Q'){
int l,r; cin >> l >> r;
cout << __gcd(query(1,l + 1,r),sum(1,1,l)) << "\n";
}else{
int l,r,k; cin >> l >> r >> k;
change(1,l,k);
if(r + 1 <= n) change(1,r + 1,-k);
}
}
return 0;
}