struct Node{
mint R = 0, RO = 0, ROC = 0, ROCK = 0, O = 0, OC = 0, OCK = 0, C = 0, CK = 0, K = 0;
mint len = 0;
mint ans = 0;
Node(){};
Node(char c){
if(c == 'R') R += 1;
if(c == 'O') O += 1;
if(c == 'C') C += 1;
if(c == 'K') K += 1;
len = 1;
};
};
Node pull(Node a, Node b){
Node ret;
ret.R = a.R + mint(2).pow(a.len.val)*b.R;
ret.O = a.O + b.O;
ret.C = a.C + b.C;
ret.K = a.K + b.K;
ret.RO = a.RO + mint(2).pow(a.len.val)*b.RO + a.R*b.O;
ret.OC = a.OC + b.OC + a.O*b.C;
ret.CK = a.CK + b.CK + a.C*b.K;
ret.ROC = a.ROC + mint(2).pow(a.len.val)*b.ROC + a.RO*b.C + a.R*b.OC;
ret.OCK = a.OCK + b.OCK + a.OC*b.K + a.O*b.CK;
ret.ROCK = a.ROCK + mint(2).pow(a.len.val)*b.ROCK + a.ROC*b.K + a.RO*b.CK + a.R*b.OCK;
ret.len = a.len + b.len;
return ret;
}
void solve(){
int N; cin >> N;
string S; cin >> S;
vector<Node> v(N);
rep(i, 0, N) v[i] = Node(S[i]);
SegmentTreeNode ST(N, v);
int Q; cin >> Q;
while(Q--){
int op; cin >> op;
if(op == 1){
int idx; cin >> idx;
char c; cin >> c;
ST.set(idx-1, Node(c));
}
else{
int l, r; cin >> l >> r;
l--; r--;
cout << ST.query(l, r).ROCK << '\n';
}
}
}