#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=a;i<=b;i++)
const int N = 1e6 + 5, TN = 1e7;
inline int read();
int n, Q, a[N], Tree[N], Tree_P[N], v, l, r, lazy[N];
bitset <1> P[TN + 5];
inline void Solve() {
P[1][0] = 0;
F(i, 2, TN) {
if (P[i][0]) continue;
for (int j = i + i; j <= TN; j += i) P[j] |= 1;
}
return;
}
inline void Merge(int num) {
Tree[num] = Tree[num << 1] + Tree[num << 1 | 1];
Tree_P[num] = Tree_P[num << 1] + Tree_P[num << 1 | 1];
return;
}
inline void Push_down(int num, int l, int r) {
if (!lazy[num]) return;
int mid = (l + r) >> 1;
lazy[num << 1] = lazy[num << 1 | 1] = lazy[num];
Tree[num << 1] = (mid - l + 1) * lazy[num];
Tree[num << 1 | 1] = (r - mid) * lazy[num];
Tree_P[num << 1] = Tree_P[num << 1 | 1] = 0;
if (lazy[num] <= TN) {
if (!P[lazy[num]][0]) {
Tree_P[num << 1] = (mid - l + 1);
Tree_P[num << 1 | 1] = (r - mid);
}
}
lazy[num] = 0;
return;
}
inline void Build(int num, int l, int r) {
if (l == r) {
Tree[num] = a[l];
if (a[l] <= TN) {
if (!P[a[l]][0]) Tree_P[num] = 1;
}
return;
}
int mid = (l + r) >> 1;
Build(num << 1, l, mid);
Build(num << 1 | 1, mid + 1, r);
Merge(num);
}
char opt;
inline void Modify(int num, int l, int r, int l1, int r1, int val) {
if (l > r1 || r < l1) return;
if (l == r && l == l1) {
Tree[num] += val;
Tree_P[num] = 0;
if (Tree[num] <= TN) {
if (!P[Tree[num]][0]) Tree_P[num] = 1;
}
return;
}
int mid = (l + r) >> 1;
Modify(num << 1, l, mid, l1, r1, val);
Modify(num << 1 | 1, mid + 1, r, l1, r1, val);
Merge(num);
}
inline int Query(int num, int l, int r, int l1, int r1) {
Push_down(num, l, r);
if (l > r1 || r < l1) return 0;
if (l1 <= l && r <= r1) return Tree_P[num];
int mid = (l + r) >> 1;
return Query(num << 1, l, mid, l1, r1) + Query(num << 1 | 1, mid + 1, r, l1, r1);
}
inline void Modify1(int num, int l, int r, int l1, int r1, int val) {
if (l > r1 || r < l1) return;
if (l1 <= l && r <= r1) {
Tree[num] = (r - l + 1) * val;
Tree_P[num] = 0;
lazy[num] = val;
if (val <= TN) {
if (!P[val][0]) Tree_P[num] = r - l + 1;
}
return;
}
int mid = (l + r) >> 1;
Push_down(num,l,r);
Modify1(num << 1, l, mid, l1, r1, val);
Modify1(num << 1 | 1, mid + 1, r, l1, r1, val);
Push_down(num, l, r);
Merge(num);
}
signed main() {
n = read(), Q = read();
F(i, 1, n) a[i] = read();
Solve();
Build(1, 1, n);
while (Q--) {
cin >> opt;
if (opt == 'A') {
v = read(), l = read();
Modify(1, 1, n, l, l, v);
}
if (opt == 'Q') {
l = read(), r = read();
cout << Query(1, 1, n, l, r) << endl;
}
if (opt == 'R') {
v = read(), l = read(), r = read();
Modify1(1, 1, n, l, r, v);
}
}
return 0;
}
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f *= -1;
c = getchar();
}
while (c <= '9' && c >= '0') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
return x * f;
}