#include <bits/stdc++.h>
using lint = long long;
const int N = 6;
#define DEBUG
int n, m;
size_t l, r;
lint d, a[N], b[N];
struct SegmentTree {
lint w[4 * N];
bool outRange(int l, int r, int L, int R) {
return l > R || r < L;
}
bool inRange(int l, int r, int L, int R) {
return l >= L && r <= R;
}
void pushup(int u) {
w[u] = std::__gcd(w[u * 2], w[u * 2 + 1]);
}
void build(int u, int l, int r, lint *a) {
if (l == r) {
w[u] = a[l];
return ;
}
int mid = l + r >> 1;
build(u * 2, l, mid, a);
build(u * 2 + 1, mid + 1, r, a);
pushup(u);
}
lint query(int u, int l, int r, int L, int R) {
if (outRange(l, r, L, R)) return -1;
if (inRange(l, r, L, R)) return w[u];
int mid = l + r >> 1;
lint lans = query(u * 2, l, mid, L, R);
lint rans = query(u * 2 + 1, mid + 1, r, L, R);
lint res;
if (lans == -1) {
if (rans == -1) res = -1;
else res = rans;
} else {
if (rans == -1) res = lans;
else res = std::__gcd(lans, rans);
}
return res;
}
void update(int u, int l, int r, int p, int delta) {
if (outRange(l, r, p, p)) return ;
if (inRange(l, r, p, p) && l == r) {
w[u] += delta;
return ;
}
int mid = l + r >> 1;
update(u * 2 , l, mid, p, delta);
update(u * 2 + 1, mid + 1, r, p, delta);
}
};
struct BIT {
lint w[N];
int lowbit(int i) {
return i & (-i);
}
void add(size_t p, lint delta) {
for (size_t i = p; i <= n; i += lowbit(i))
w[i] += delta;
}
lint query(size_t p) {
lint res = 0;
for (size_t i = p; i >= 1; i -= lowbit(i))
res += w[i];
return res;
}
};
BIT t;
SegmentTree tree;
signed main() {
#ifndef DEBUG
std::cin.tie(0)->sync_with_stdio(0);
#endif
std::cin >> n >> m;
assert(n <= (int)5e5);
assert(m <= (int)1e5);
for (int i = 1; i <= n; ++i) {
std::cin >> a[i];
assert(a[i] >= 1 && a[i] <= (lint)1e18);
b[i] = a[i] - a[i - 1];
t.add(i, b[i]);
}
#ifdef DEBUG
for (int i = 1; i <= n; ++i) printf("%3d", i);
puts("");
for (int i = 1; i <= n; ++i) printf("%3d", a[i]);
puts("");
for (int i = 1; i <= n; ++i) printf("%3d", b[i]);
puts("");
for (int i = 1; i <= n; ++i) printf("%3d", t.w[i]);
puts("");
#endif
tree.build(1, 1, n, b);
for (std::string op; m; --m) {
std::cin >> op >> l >> r;
assert(l >= 1 && l <= n);
assert(r >= 1 && r <= n && r >= l);
if (op == "C") {
std::cin >> d;
tree.update(1, 1, n, l, d);
t.add(l, d);
if (r < n) {
tree.update(1, 1, n, r + 1, -d);
t.add(r + 1, d);
}
} else if (op == "Q") {
if (l == r) std::cout << abs(t.query(l)) << '\n';
else if (l + 1 == r) std::cout << abs(std::__gcd(t.query(l), t.query(r))) << '\n';
else std::cout << abs(std::__gcd(t.query(l), tree.query(1, 1, n, l + 1, r))) << '\n';
} else exit(1);
}
std::cout.flush();
return 0;
}