//;Write by lk1993, 2014.3.23
#include <stdio.h>
#include <string.h>
const int M = 1000000 + 5;
int sum[M];
inline void pushDown(int rt)
{
if(sum[rt] >= 0)
{
sum[rt << 1] = sum[rt << 1 | 1] = sum[rt];
sum[rt] = -1;
}
}
inline void pushUp(int rt)
{
if(sum[rt << 1] != -1 && sum[rt << 1 | 1] != -1 && sum[rt << 1] == sum[rt << 1 | 1])
{
sum[rt] = sum[rt << 1];
}
}
void build(int l, int r, int rt)
{
if(l == r)
{
scanf("%d", &sum[rt]);
return ;
}
int m = (l + r) >> 1;
build(l, m, rt << 1);
build(m + 1, r, rt << 1 | 1);
pushUp(rt);
}
void update(char op, int val, int ul, int ur, int l, int r, int rt)
{
if(ul <= l && ur >= r)
{
if(sum[rt] >= 0)
{
if(‘A‘ == op) sum[rt] &= val;
else if(‘X‘ == op) sum[rt] ^= val;
else if(‘O‘ == op) sum[rt] |= val;
return ;
}
}
pushDown(rt);
int m = (l + r) >> 1;
if(ul <= m)
{
update(op, val, ul, ur, l, m, rt << 1);
}
if(ur > m)
{
update(op, val, ul, ur, m + 1, r, rt << 1 | 1);
}
pushUp(rt);
}
int query(int ql, int qr, int l, int r, int rt)
{
if(ql <= l && qr >= r)
{
if(sum[rt] >= 0)
{
return sum[rt] * (r - l + 1);
}
}
pushDown(rt);
int m = (l + r) >> 1;
int ret = 0;
if(ql <= m)
{
ret += query(ql, qr, l, m, rt << 1);
}
if(qr > m)
{
ret += query(ql, qr, m + 1, r, rt << 1 | 1);
}
return ret;
}
int main(int argc, char* argv[])
{
#ifdef __MYLOCAL
freopen("in.txt", "r", stdin);
#endif
int t, n, m, a, b, c;
char oper[10];
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
memset(sum, -1, sizeof(sum));
build(1, n, 1);
while(m--)
{
scanf("%s", oper);
if(‘S‘ == oper[0])
{
scanf("%d%d", &a, &b);
printf("%d\n", query(a + 1, b + 1, 1, n, 1));
}
else
{
scanf("%d%d%d", &a, &b, &c);
update(oper[0], a, b + 1, c + 1, 1, n, 1);
}
}
}
return 0;
}