#include<bits/stdc++.h>
#define maxn 500005
#define int unsigned long long
using namespace std;
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
inline void write(unsigned long long x){
if(x>=10)write(x/10);
putchar(x%10+'0');
return;
}
int n,m,q,a[maxn],choose[maxn];
int cnt1[maxn*4],cnt0[maxn*4],len[maxn*4];
int tag_xor[maxn*4],tag_fg[maxn*4];
bool fg[maxn*4];
unsigned long long ans[maxn];
inline void pushdown(int id){
if(fg[id]){
cnt1[id<<1]=cnt0[id<<1]=0;
if(tag_fg[id]==1)cnt1[id<<1]=len[id<<1];
else cnt0[id<<1]=len[id<<1];
cnt1[id<<1|1]=cnt0[id<<1|1]=0;
if(tag_fg[id]==1)cnt1[id<<1|1]=len[id<<1|1];
else cnt0[id<<1|1]=len[id<<1|1];
fg[id]=false;fg[id<<1]=fg[id<<1|1]=true;
tag_fg[id<<1]=tag_fg[id<<1|1]=tag_fg[id];
}
if(tag_xor[id]){
tag_xor[id<<1]^=tag_xor[id];
swap(cnt1[id<<1],cnt0[id<<1]);
tag_xor[id<<1|1]^=tag_xor[id];
swap(cnt1[id<<1|1],cnt0[id<<1|1]);
tag_xor[id]=0;
}
return;
}
inline void pushup(int id){
cnt0[id]=cnt0[id<<1]+cnt0[id<<1|1];
cnt1[id]=cnt1[id<<1]+cnt1[id<<1|1];
return;
}
inline void build(int id,int l,int r){
tag_fg[id]=false;
tag_xor[id]=0;len[id]=r-l+1;
if(l==r){
if(choose[l])cnt1[id]=1,cnt0[id]=0;
else cnt1[id]=0,cnt0[id]=1;
return;
}
int mid=(l+r)>>1;
build(id*2,l,mid);build(id*2+1,mid+1,r);
pushup(id);return;
}
inline void xor_(int id,int l,int r,int tol,int tor){
if(tol<=l&&r<=tor){
pushdown(id);
tag_xor[id]^=1;
swap(cnt0[id],cnt1[id]);
return;
}
int mid=(l+r)>>1;pushdown(id);
if(tol<=mid)xor_(id<<1,l,mid,tol,tor);
if(mid<tor)xor_(id<<1|1,mid+1,r,tol,tor);
pushup(id);return;
}
inline void fugai(int id,int l,int r,int tol,int tor,int val){
if(tol<=l&&r<=tor){
pushdown(id);
fg[id]=1;tag_fg[id]=val;
if(val)cnt0[id]=0,cnt1[id]=len[id];
else cnt1[id]=0,cnt0[id]=len[id];
return;
}
int mid=(l+r)>>1;pushdown(id);
if(tol<=mid)fugai(id<<1,l,mid,tol,tor,val);
if(mid<tor)fugai(id<<1|1,mid+1,r,tol,tor,val);
pushup(id);return;
}
inline int query(int id,int l,int r,int tol,int tor){
if(tol<=l&&r<=tor)return cnt0[id];int mid=(l+r)>>1;pushdown(id);
if(tor<=mid)return query(id<<1,l,mid,tol,tor);
if(mid<tol)return query(id<<1|1,mid+1,r,tol,tor);
return query(id<<1,l,mid,tol,tor)+query(id<<1|1,mid+1,r,tol,tor);
}
struct ask{int op,l,r,cz,x;}que[100005];
char Cz[maxn][100];
inline char get(){
char ch=getchar();
while(ch!='X'&&ch!='A'&&ch!='O')ch=getchar();
return ch;
}
signed main(){
n=read();m=read();q=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=m;++i)
for(int j=0;j<63;++j)Cz[i][j]=get();
for(int i=1;i<=q;++i){
que[i].op=read();
if(que[i].op==0)que[i].l=read(),que[i].r=read(),que[i].cz=read();
else que[i].l=read(),que[i].r=read(),que[i].cz=read(),que[i].x=read();
}
for(int wei=0;wei<63;++wei){
for(int i=1;i<=n;++i){
if(a[i]&(1ull<<wei))choose[i]=1;
else choose[i]=0;
}
build(1,1,n);
for(int i=1;i<=q;++i){
if(que[i].l>que[i].r)swap(que[i].l,que[i].r);
if(que[i].op==0){
int zero=query(1,1,n,que[i].l,que[i].r);
int one=que[i].r-que[i].l+1-zero;
if(Cz[que[i].cz][wei]=='A'){
if(zero==0)
ans[i]+=(1ull<<wei);
}
else if(Cz[que[i].cz][wei]=='O'){
if(one>0)
ans[i]+=(1ull<<wei);
}
else{
if(one&1)
ans[i]+=(1ull<<wei);
}
}
else{
bool delta=(que[i].x&(1ull<<wei));
if(Cz[que[i].cz][wei]=='A'){
if(!delta)fugai(1,1,n,que[i].l,que[i].r,0);
}
else if(Cz[que[i].cz][wei]=='O'){
if(delta)fugai(1,1,n,que[i].l,que[i].r,1);
}
else{
if(delta)xor_(1,1,n,que[i].l,que[i].r);
}
}
}
}
for(int i=1;i<=q;++i)
if(que[i].op==0){
write(ans[i]);
putchar('\n');
}
return 0;
}