#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
class SegmentTree
{
private:
vector<int> st, lazy, A;
int N;
int lt(int p) { return p << 1; }
int rt(int p) { return (p << 1) + 1;}
void build(int p, int L, int R) {
if(L == R)
st[p] = A[L];
else {
build( lt(p), L, (L+R)/2);
build( rt(p), (L+R)/2 + 1, R);
st[p] = st[lt(p)] + st[rt(p)];
}
}
void set(int p, int L, int R, int i, int j) {
update(p, L, R);
if( i > R || j < L ) return;
if( i <= L && R <= j ) {
st[p] = R - L + 1;
if(L != R) lazy[ lt(p) ] = lazy[ rt(p) ] = 1;
return;
}
set( lt(p), L, (L+R)/2, i, j );
set( rt(p), (L+R)/2 + 1, R, i, j );
st[p] = st[ lt(p) ] + st[ rt(p) ];
}
void clear(int p, int L, int R, int i, int j) {
update(p, L, R);
if( i > R || j < L ) return;
if( i <= L && R <= j ) {
st[p] = 0;
if(L != R) lazy[ lt(p) ] = lazy[ rt(p) ] = 0;
return;
}
clear( lt(p), L, (L+R)/2, i, j );
clear( rt(p), (L+R)/2 + 1, R, i, j );
st[p] = st[ lt(p) ] + st[ rt(p) ];
}
void flip(int p, int L, int R, int i, int j) {
update(p, L, R);
if( i > R || j < L ) return;
if( i <= L && R <= j ) {
st[p] = R - L + 1 - st[p];
if(L != R) {
lazy[ lt(p) ] = go_flip( lt(p) );
lazy[ rt(p) ] = go_flip( rt(p) );
}
return;
}
flip( lt(p), L, (L+R)/2, i, j );
flip( rt(p), (L+R)/2 + 1, R, i, j );
st[p] = st[ lt(p) ] + st[ rt(p) ];
}
int rsq(int p, int L, int R, int i, int j) {
if( i > R || j < L ) return 0;
update(p, L, R);
if( i <= L && R <= j ) return st[p];
return rsq( lt(p), L, (L+R)/2, i, j)
+ rsq( rt(p), (L+R)/2 + 1, R, i, j);
}
int go_flip(int p) {
if( lazy[p] == 0 || lazy[p] == 1 ) return !lazy[p];
if( lazy[p] == 2 ) return -1;
return 2;
}
void update(int p, int L, int R) {
if( lazy[p] < 0 ) return;
if( lazy[p] == 0 || lazy[p] == 1 ) {
st[p] = lazy[p] ? R - L + 1 : 0;
if(L != R) lazy[lt(p)] = lazy[rt(p)] = lazy[p];
} else {
st[p] = R - L + 1 - st[p];
if(L != R) {
lazy[ lt(p) ] = go_flip( lt(p) );
lazy[ rt(p) ] = go_flip( rt(p) );
}
}
lazy[p] = -1;
}
public:
SegmentTree(const vector<int> _A) {
A = _A; N = (int)_A.size();
st.assign(4 * N, 0);
lazy.assign(4 * N, -1);
build(1, 0, N - 1);
}
void set (int i, int j) { set (1, 0, N - 1, i, j); }
void clear(int i, int j) { clear(1, 0, N - 1, i, j); }
void flip (int i, int j) { flip (1, 0, N - 1, i, j); }
int rsq (int i, int j) { rsq (1, 0, N - 1, i, j); }
};
vector<int> pirates;
int main()
{
int T;
scanf("%d\n", &T);
for(int k = 1; k <= T; ++k) {
printf("Case %d:\n", k);
int M; scanf("%d\n", &M);
while(M--) {
int t; scanf("%d\n", &t);
char input[51]; scanf("%s\n", input);
int N = strlen( input );
while(t--)
for(int i = 0; i < N; ++i)
pirates.push_back( input[i] - '0' );
}
SegmentTree pirates_count( pirates );
int Q, count = 0;
scanf("%d\n", &Q);
while(Q--) {
char op; int i, j;
scanf("%c %d %d\n", &op, &i, &j);
if(op == 'F')
pirates_count.set(i, j);
else if(op == 'E')
pirates_count.clear(i, j);
else if(op == 'I')
pirates_count.flip(i, j);
else
printf("Q%d: %d\n", ++count, pirates_count.rsq(i, j));
}
pirates.clear();
}
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdHJpbmc+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU2VnbWVudFRyZWUKewpwcml2YXRlOgogICAgdmVjdG9yPGludD4gc3QsIGxhenksIEE7CiAgICBpbnQgTjsKCiAgICBpbnQgbHQoaW50IHApIHsgcmV0dXJuIHAgPDwgMTsgfQogICAgaW50IHJ0KGludCBwKSB7IHJldHVybiAocCA8PCAxKSArIDE7fQoKICAgIHZvaWQgYnVpbGQoaW50IHAsIGludCBMLCBpbnQgUikgewogICAgICAgIGlmKEwgPT0gUikKICAgICAgICAgICAgc3RbcF0gPSBBW0xdOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBidWlsZCggbHQocCksIEwsIChMK1IpLzIpOwogICAgICAgICAgICBidWlsZCggcnQocCksIChMK1IpLzIgKyAxLCBSKTsKICAgICAgICAgICAgc3RbcF0gPSBzdFtsdChwKV0gKyBzdFtydChwKV07CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgc2V0KGludCBwLCBpbnQgTCwgaW50IFIsIGludCBpLCBpbnQgaikgewogICAgICAgIHVwZGF0ZShwLCBMLCBSKTsKCiAgICAgICAgaWYoIGkgPiAgUiB8fCBqIDwgIEwgKSByZXR1cm47CiAgICAgICAgaWYoIGkgPD0gTCAmJiBSIDw9IGogKSB7CiAgICAgICAgICAgIHN0W3BdID0gUiAtIEwgKyAxOwoKICAgICAgICAgICAgaWYoTCAhPSBSKSBsYXp5WyBsdChwKSBdID0gbGF6eVsgcnQocCkgXSA9IDE7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHNldCggbHQocCksIEwsIChMK1IpLzIsIGksIGogICk7CiAgICAgICAgc2V0KCBydChwKSwgKEwrUikvMiArIDEsIFIsIGksIGogKTsKICAgICAgICBzdFtwXSA9IHN0WyBsdChwKSBdICsgc3RbIHJ0KHApIF07CiAgICB9CgogICAgdm9pZCBjbGVhcihpbnQgcCwgaW50IEwsIGludCBSLCBpbnQgaSwgaW50IGopIHsKICAgICAgICB1cGRhdGUocCwgTCwgUik7CgogICAgICAgIGlmKCBpID4gIFIgfHwgaiA8ICBMICkgcmV0dXJuOwogICAgICAgIGlmKCBpIDw9IEwgJiYgUiA8PSBqICkgewogICAgICAgICAgICBzdFtwXSA9IDA7CgogICAgICAgICAgICBpZihMICE9IFIpIGxhenlbIGx0KHApIF0gPSBsYXp5WyBydChwKSBdID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2xlYXIoIGx0KHApLCBMLCAoTCtSKS8yLCBpLCBqICApOwogICAgICAgIGNsZWFyKCBydChwKSwgKEwrUikvMiArIDEsIFIsIGksIGogKTsKICAgICAgICBzdFtwXSA9IHN0WyBsdChwKSBdICsgc3RbIHJ0KHApIF07CiAgICB9CgogICAgdm9pZCBmbGlwKGludCBwLCBpbnQgTCwgaW50IFIsIGludCBpLCBpbnQgaikgewogICAgICAgIHVwZGF0ZShwLCBMLCBSKTsKCiAgICAgICAgaWYoIGkgPiAgUiB8fCBqIDwgIEwgKSByZXR1cm47CiAgICAgICAgaWYoIGkgPD0gTCAmJiBSIDw9IGogKSB7CiAgICAgICAgICAgIHN0W3BdID0gUiAtIEwgKyAxIC0gc3RbcF07CgogICAgICAgICAgICBpZihMICE9IFIpIHsKICAgICAgICAgICAgICAgIGxhenlbIGx0KHApIF0gPSBnb19mbGlwKCBsdChwKSApOwogICAgICAgICAgICAgICAgbGF6eVsgcnQocCkgXSA9IGdvX2ZsaXAoIHJ0KHApICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZmxpcCggbHQocCksIEwsIChMK1IpLzIsIGksIGogICk7CiAgICAgICAgZmxpcCggcnQocCksIChMK1IpLzIgKyAxLCBSLCBpLCBqICk7CiAgICAgICAgc3RbcF0gPSBzdFsgbHQocCkgXSArIHN0WyBydChwKSBdOwogICAgfQoKICAgIGludCByc3EoaW50IHAsIGludCBMLCBpbnQgUiwgaW50IGksIGludCBqKSB7CiAgICAgICAgaWYoIGkgPiAgUiB8fCBqIDwgIEwgKSByZXR1cm4gMDsKCiAgICAgICAgdXBkYXRlKHAsIEwsIFIpOwoKICAgICAgICBpZiggaSA8PSBMICYmIFIgPD0gaiApIHJldHVybiBzdFtwXTsKCiAgICAgICAgcmV0dXJuIHJzcSggbHQocCksIEwsIChMK1IpLzIsIGksIGopCiAgICAgICAgICAgICArIHJzcSggcnQocCksIChMK1IpLzIgKyAxLCBSLCBpLCBqKTsKICAgIH0KCiAgICBpbnQgZ29fZmxpcChpbnQgcCkgewogICAgICAgIGlmKCBsYXp5W3BdID09IDAgfHwgbGF6eVtwXSA9PSAxICkgcmV0dXJuICFsYXp5W3BdOwogICAgICAgIGlmKCBsYXp5W3BdID09IDIgKSByZXR1cm4gLTE7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgogICAgdm9pZCB1cGRhdGUoaW50IHAsIGludCBMLCBpbnQgUikgewogICAgICAgIGlmKCBsYXp5W3BdIDwgMCApIHJldHVybjsKICAgICAgICBpZiggbGF6eVtwXSA9PSAwIHx8IGxhenlbcF0gPT0gMSApIHsKICAgICAgICAgICAgc3RbcF0gPSBsYXp5W3BdID8gUiAtIEwgKyAxIDogMDsKCiAgICAgICAgICAgIGlmKEwgIT0gUikgbGF6eVtsdChwKV0gPSBsYXp5W3J0KHApXSA9IGxhenlbcF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RbcF0gPSBSIC0gTCArIDEgLSBzdFtwXTsKCiAgICAgICAgICAgIGlmKEwgIT0gUikgewogICAgICAgICAgICAgICAgbGF6eVsgbHQocCkgXSA9IGdvX2ZsaXAoIGx0KHApICk7CiAgICAgICAgICAgICAgICBsYXp5WyBydChwKSBdID0gZ29fZmxpcCggcnQocCkgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXp5W3BdID0gLTE7CiAgICB9CgpwdWJsaWM6CiAgICBTZWdtZW50VHJlZShjb25zdCB2ZWN0b3I8aW50PiBfQSkgewogICAgICAgIEEgPSBfQTsgTiA9IChpbnQpX0Euc2l6ZSgpOwogICAgICAgIHN0LmFzc2lnbig0ICogTiwgMCk7CiAgICAgICAgbGF6eS5hc3NpZ24oNCAqIE4sIC0xKTsKICAgICAgICBidWlsZCgxLCAwLCBOIC0gMSk7CiAgICB9CgogICAgdm9pZCBzZXQgIChpbnQgaSwgaW50IGopIHsgc2V0ICAoMSwgMCwgTiAtIDEsIGksIGopOyB9CiAgICB2b2lkIGNsZWFyKGludCBpLCBpbnQgaikgeyBjbGVhcigxLCAwLCBOIC0gMSwgaSwgaik7IH0KICAgIHZvaWQgZmxpcCAoaW50IGksIGludCBqKSB7IGZsaXAgKDEsIDAsIE4gLSAxLCBpLCBqKTsgfQogICAgaW50ICByc3EgIChpbnQgaSwgaW50IGopIHsgcnNxICAoMSwgMCwgTiAtIDEsIGksIGopOyB9Cn07Cgp2ZWN0b3I8aW50PiBwaXJhdGVzOwoKaW50IG1haW4oKQp7CiAgICBpbnQgVDsKCiAgICBzY2FuZigiJWRcbiIsICZUKTsKCiAgICBmb3IoaW50IGsgPSAxOyBrIDw9IFQ7ICsraykgewogICAgICAgIHByaW50ZigiQ2FzZSAlZDpcbiIsIGspOwoKICAgICAgICBpbnQgTTsgc2NhbmYoIiVkXG4iLCAmTSk7CgogICAgICAgIHdoaWxlKE0tLSkgewogICAgICAgICAgICBpbnQgIHQ7ICAgICAgICAgc2NhbmYoIiVkXG4iLCAmdCk7CiAgICAgICAgICAgIGNoYXIgaW5wdXRbNTFdOyBzY2FuZigiJXNcbiIsIGlucHV0KTsKCiAgICAgICAgICAgIGludCBOID0gc3RybGVuKCBpbnB1dCApOwoKICAgICAgICAgICAgd2hpbGUodC0tKQogICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE47ICsraSkKICAgICAgICAgICAgICAgICAgICBwaXJhdGVzLnB1c2hfYmFjayggaW5wdXRbaV0gLSAnMCcgKTsKICAgICAgICB9CgogICAgICAgIFNlZ21lbnRUcmVlIHBpcmF0ZXNfY291bnQoIHBpcmF0ZXMgKTsKCiAgICAgICAgaW50IFEsIGNvdW50ID0gMDsKICAgICAgICBzY2FuZigiJWRcbiIsICZRKTsKCiAgICAgICAgd2hpbGUoUS0tKSB7CiAgICAgICAgICAgIGNoYXIgb3A7IGludCBpLCBqOwoKICAgICAgICAgICAgc2NhbmYoIiVjICVkICVkXG4iLCAmb3AsICZpLCAmaik7CgogICAgICAgICAgICBpZihvcCA9PSAnRicpCiAgICAgICAgICAgICAgICBwaXJhdGVzX2NvdW50LnNldChpLCBqKTsKICAgICAgICAgICAgZWxzZSBpZihvcCA9PSAnRScpCiAgICAgICAgICAgICAgICBwaXJhdGVzX2NvdW50LmNsZWFyKGksIGopOwogICAgICAgICAgICBlbHNlIGlmKG9wID09ICdJJykKICAgICAgICAgICAgICAgIHBpcmF0ZXNfY291bnQuZmxpcChpLCBqKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcHJpbnRmKCJRJWQ6ICVkXG4iLCArK2NvdW50LCBwaXJhdGVzX2NvdW50LnJzcShpLCBqKSk7CiAgICAgICAgfQoKICAgICAgICBwaXJhdGVzLmNsZWFyKCk7CiAgICB9Cn0K