#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 500010;
int n, q;
ll a[N], b[N], tr[N], g[N*4];
int ls(int u) { return u << 1; }
int rs(int u) { return u << 1 | 1; }
//Interval GCD
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lowbit(ll i) { return i & -i; }
void add(int x, ll k) {
for (int i = x; i <= n; i += lowbit(i)) tr[i] += k;
}
ll sum(int x) {
ll res = 0;
for (int i = x; i > 0; i -= lowbit(i)) res += tr[i];
return res;
}
void pushUp(int u) { g[u] = gcd(g[ls(u)], g[rs(u)]); }
void build(int u, int l, int r) {
if (l == r) {
g[u] = b[r];
return;
}
int mid = (l + r) >> 1;
build(ls(u), l, mid);
build(rs(u), mid + 1, r);
pushUp(u);
}
void update(int u, int l, int r, int x, ll k) {
if (l == x && r == x) { g[u] += k; return; }
int mid = (l + r) >> 1;
if (x <= mid) update(ls(u), l, mid, x, k);
else update(rs(u), mid + 1, r, x, k);
pushUp(u);
}
int query(int u, int l, int r, int ql, int qr) {
if (l >= ql && r <= qr) return g[u];
int mid = (l + r) >> 1, g = 0;
if (ql <= mid) g = query(ls(u), l, mid, ql, qr);
if (qr > mid) g = gcd(g, query(rs(u), mid + 1, r, ql, qr));
return g;
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
b[i] = a[i] - a[i - 1];
}
build(1, 1, n);
while(q--) {
char o[2]; int l, r;
scanf("%s%d%d", o, &l, &r);
if (*o == 'C') {
ll k;
scanf("%lld", &k);
update(1, 1, n, l, k);
add(l, k);
if (r < n) {
update(1, 1, n, r + 1, -k);
add(r + 1, -k);
}
} else {
ll v = a[l] + sum(l);
printf("%lld\n", abs(gcd(v, query(1, 1, n, l + 1, r))));
}
}
return 0;
}