#include <bits/stdc++.h>
using namespace std;
struct Tree
{
vector< int > tree, arr, lazy;
int n;
void build( int node, int start, int end)
{
if ( start == end)
tree[ node] = arr[ start] ;
else
{
int mid = ( start+ end) / 2 ;
build( node* 2 , start, mid) ;
build( node* 2 + 1 , mid+ 1 , end) ;
tree[ node] = tree[ node* 2 ] + tree[ node* 2 + 1 ] ;
}
}
int reduce( int mode, int start, int end, int val)
{
if ( mode == 1 )
return end- start+ 1 ;
else if ( mode == 2 )
return 0 ;
else if ( mode == 3 )
return end- start+ 1 - val;
else
return val;
}
void lazy_prog( int node, int start, int end)
{
if ( lazy[ node] ! = 0 )
{
//cout << "Pushing node " << node << '\n';
tree[ node] = reduce( lazy[ node] , start, end, tree[ node] ) ;
if ( start ! = end)
{
lazy[ node* 2 ] = lazy[ node] ;
lazy[ node* 2 + 1 ] = lazy[ node] ;
}
lazy[ node] = 0 ;
}
}
int query( int node, int start, int end, int i, int j)
{
lazy_prog( node, start, end) ;
if ( i > end || j < start)
return 0 ;
if ( start >= i && end <= j)
return tree[ node] ;
int mid = ( start+ end) / 2 ;
int s1 = query( node* 2 , start, mid, i, j) ;
int s2 = query( node* 2 + 1 , mid+ 1 , end, i, j) ;
//cout << start << " - " << mid << ": " << s1 << " ";
//cout << mid+1 << " - " << end << ": " << s2 << '\n';
return s1 + s2;
}
void update( int node, int start, int end, int i, int j, int mode)
{
lazy_prog( node, start, end) ;
if ( start > j || end < i)
return ;
if ( start >= i && end <= j)
{
tree[ node] = reduce( mode, start, end, tree[ node] ) ;
if ( start ! = end)
{
lazy[ node* 2 ] = mode;
lazy[ node* 2 + 1 ] = mode;
}
return ;
}
int mid = ( start+ end) / 2 ;
update( node* 2 , start, mid, i, j, mode) ;
update( node* 2 + 1 , mid+ 1 , end, i, j, mode) ;
tree[ node] = tree[ node* 2 ] + tree[ node* 2 + 1 ] ;
}
Tree( vector< int > a)
{
arr = a;
n = ( int ) a.size ( ) ;
tree.assign ( 4 * n, 0 ) ;
lazy.assign ( 4 * n, 0 ) ;
build( 1 , 0 , n- 1 ) ;
}
} ;
int main( int argc, char ** argv)
{
ios:: sync_with_stdio ( 0 ) ;
cin .tie ( 0 ) ;
freopen ( ".in" , "r" , stdin ) ;
freopen ( ".out" , "w" , stdout ) ;
int t;
cin >> t;
for ( int k = 0 ; k < t; k++ )
{
string land = "" ;
int n;
cin >> n;
while ( n-- )
{
int T; cin >> T;
string s; cin >> s;
for ( int i = 0 ; i < T; i++ )
land + = s;
}
vector< int > A( ( int ) land.length ( ) ) ;
for ( int i = 0 ; i < ( int ) land.length ( ) ; i++ )
A[ i] = ( land[ i] == '1' ? 1 : 0 ) ;
Tree segtree( A) ;
//for (int i = 0; i < segtree.tree.size(); i++)
//cout << i << ": " << segtree.tree[i] << '\n';
cout << "Case " << k+ 1 << ":\n " ;
int q;
cin >> q;
int Q = 1 ;
for ( int i = 0 ; i < q; i++ )
{
char c; int a, b;
cin >> c >> a >> b;
if ( c ! = 'S' )
{
int mode;
if ( c == 'F' ) mode = 1 ;
else if ( c == 'E' ) mode = 2 ;
else mode = 3 ;
segtree.update ( 1 , 0 , A.size ( ) - 1 , a, b, mode) ;
//cout << mode << ' ' << segtree.query(1, 0, A.size()-1, a, b) << ' ' << segtree.query(1, 0, A.size()-1, b+1, A.size()-1) << '\n';
}
else
cout << "Q" << Q++ << ": " << segtree.query ( 1 , 0 , A.size ( ) - 1 , a, b) << '\n ' ;
}
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgVHJlZSAKewoJdmVjdG9yPGludD4gdHJlZSwgYXJyLCBsYXp5OwoJaW50IG47CgkKCXZvaWQgYnVpbGQoaW50IG5vZGUsIGludCBzdGFydCwgaW50IGVuZCkKCXsKCQlpZiAoc3RhcnQgPT0gZW5kKQoJCQl0cmVlW25vZGVdID0gYXJyW3N0YXJ0XTsKCQllbHNlIAoJCXsKCQkJaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CgkJCWJ1aWxkKG5vZGUqMiwgc3RhcnQsIG1pZCk7CgkJCWJ1aWxkKG5vZGUqMisxLCBtaWQrMSwgZW5kKTsKCgkJCXRyZWVbbm9kZV0gPSB0cmVlW25vZGUqMl0gKyB0cmVlW25vZGUqMisxXTsKCQl9Cgl9CgoJaW50IHJlZHVjZShpbnQgbW9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgdmFsKQoJewoJCWlmIChtb2RlID09IDEpCgkJCXJldHVybiBlbmQtc3RhcnQrMTsKCQllbHNlIGlmIChtb2RlID09IDIpCgkJCXJldHVybiAwOwoJCWVsc2UgaWYgKG1vZGUgPT0gMykKCQkJcmV0dXJuIGVuZC1zdGFydCsxLXZhbDsKCQllbHNlCgkJCXJldHVybiB2YWw7Cgl9CgoJdm9pZCBsYXp5X3Byb2coaW50IG5vZGUsIGludCBzdGFydCwgaW50IGVuZCkKCXsKCQlpZiAobGF6eVtub2RlXSAhPSAwKQoJCXsKCQkJLy9jb3V0IDw8ICJQdXNoaW5nIG5vZGUgIiA8PCBub2RlIDw8ICdcbic7CgkJCXRyZWVbbm9kZV0gPSByZWR1Y2UobGF6eVtub2RlXSwgc3RhcnQsIGVuZCwgdHJlZVtub2RlXSk7CgoJCQlpZiAoc3RhcnQgIT0gZW5kKQoJCQl7CgkJCQlsYXp5W25vZGUqMl0gPSBsYXp5W25vZGVdOwoJCQkJbGF6eVtub2RlKjIrMV0gPSBsYXp5W25vZGVdOwoJCQl9CgoJCQlsYXp5W25vZGVdID0gMDsKCQl9Cgl9CgoJaW50IHF1ZXJ5KGludCBub2RlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBpLCBpbnQgaikKCXsKCQlsYXp5X3Byb2cobm9kZSwgc3RhcnQsIGVuZCk7CgoJCWlmIChpID4gZW5kIHx8IGogPCBzdGFydCkKCQkJcmV0dXJuIDA7CQkKCgkJaWYgKHN0YXJ0ID49IGkgJiYgZW5kIDw9IGopCgkJCXJldHVybiB0cmVlW25vZGVdOwoJCQoKCQlpbnQgbWlkID0gKHN0YXJ0K2VuZCkvMjsKCQlpbnQgczEgPSBxdWVyeShub2RlKjIsIHN0YXJ0LCBtaWQsIGksIGopOwoJCWludCBzMiA9IHF1ZXJ5KG5vZGUqMisxLCBtaWQrMSwgZW5kLCBpLCBqKTsKCQkKCQkvL2NvdXQgPDwgc3RhcnQgPDwgIiAtICIgPDwgbWlkIDw8ICI6ICIgPDwgczEgPDwgIiAiOwoJCS8vY291dCA8PCBtaWQrMSA8PCAiIC0gIiA8PCBlbmQgPDwgIjogIiA8PCBzMiA8PCAnXG4nOwoJCXJldHVybiBzMSArIHMyOwoJfQoKCXZvaWQgdXBkYXRlKGludCBub2RlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBpLCBpbnQgaiwgaW50IG1vZGUpCgl7CgkJbGF6eV9wcm9nKG5vZGUsIHN0YXJ0LCBlbmQpOwoJCWlmIChzdGFydCA+IGogfHwgZW5kIDwgaSkKCQkJcmV0dXJuOwoKCQlpZiAoc3RhcnQgPj0gaSAmJiBlbmQgPD0gaikKCQl7CgkJCXRyZWVbbm9kZV0gPSByZWR1Y2UobW9kZSwgc3RhcnQsIGVuZCwgdHJlZVtub2RlXSk7CgoJCQlpZiAoc3RhcnQgIT0gZW5kKQoJCQl7CgkJCQlsYXp5W25vZGUqMl0gPSBtb2RlOwoJCQkJbGF6eVtub2RlKjIrMV0gPSBtb2RlOwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQlpbnQgbWlkID0gKHN0YXJ0K2VuZCkvMjsKCQl1cGRhdGUobm9kZSoyLCBzdGFydCwgbWlkLCBpLCBqLCBtb2RlKTsKCQl1cGRhdGUobm9kZSoyKzEsIG1pZCsxLCBlbmQsIGksIGosIG1vZGUpOwoKCQl0cmVlW25vZGVdID0gdHJlZVtub2RlKjJdICsgdHJlZVtub2RlKjIrMV07Cgl9CgoJVHJlZSh2ZWN0b3I8aW50PiBhKQoJewoJCWFyciA9IGE7CgkJbiA9IChpbnQpYS5zaXplKCk7CgkJdHJlZS5hc3NpZ24oNCpuLCAwKTsKCQlsYXp5LmFzc2lnbig0Km4sIDApOwoJCWJ1aWxkKDEsIDAsIG4tMSk7Cgl9Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIAp7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKCWNpbi50aWUoMCk7CglmcmVvcGVuKCIuaW4iLCAiciIsIHN0ZGluKTsKCWZyZW9wZW4oIi5vdXQiLCAidyIsIHN0ZG91dCk7CgkKCWludCB0OwoJY2luID4+IHQ7CgoJZm9yIChpbnQgayA9IDA7IGsgPCB0OyBrKyspCgl7CgkJc3RyaW5nIGxhbmQgPSAiIjsKCgkJaW50IG47CgkJY2luID4+IG47CgkJd2hpbGUgKG4tLSkKCQl7CgkJCWludCBUOyBjaW4gPj4gVDsKCQkJc3RyaW5nIHM7IGNpbiA+PiBzOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IFQ7IGkrKykKCQkJCWxhbmQgKz0gczsKCQl9CgkJCgkJdmVjdG9yPGludD4gQSgoaW50KWxhbmQubGVuZ3RoKCkpOwoKCQlmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbGFuZC5sZW5ndGgoKTsgaSsrKQoJCQlBW2ldID0gKGxhbmRbaV0gPT0gJzEnID8gMSA6IDApOwoJCQoJCVRyZWUgc2VndHJlZShBKTsKCQkvL2ZvciAoaW50IGkgPSAwOyBpIDwgc2VndHJlZS50cmVlLnNpemUoKTsgaSsrKQoJCQkvL2NvdXQgPDwgaSA8PCAiOiAiIDw8IHNlZ3RyZWUudHJlZVtpXSA8PCAnXG4nOwoKCQljb3V0IDw8ICJDYXNlICIgPDwgaysxIDw8ICI6XG4iOwoJCWludCBxOwoJCWNpbiA+PiBxOwoJCQoJCWludCBRID0gMTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykKCQl7CgkJCWNoYXIgYzsgaW50IGEsIGI7CgkJCWNpbiA+PiBjID4+IGEgPj4gYjsKCgkJCWlmIChjICE9ICdTJykKCQkJewoJCQkJaW50IG1vZGU7CgkJCQlpZiAoYyA9PSAnRicpIG1vZGUgPSAxOwoJCQkJZWxzZSBpZiAoYyA9PSAnRScpIG1vZGUgPSAyOwoJCQkJZWxzZSBtb2RlID0gMzsKCQkJCQoJCQkJc2VndHJlZS51cGRhdGUoMSwgMCwgQS5zaXplKCktMSwgYSwgYiwgbW9kZSk7CgkJCQkvL2NvdXQgPDwgbW9kZSA8PCAnICcgPDwgc2VndHJlZS5xdWVyeSgxLCAwLCBBLnNpemUoKS0xLCBhLCBiKSA8PCAnICcgPDwgc2VndHJlZS5xdWVyeSgxLCAwLCBBLnNpemUoKS0xLCBiKzEsIEEuc2l6ZSgpLTEpIDw8ICdcbic7CgkJCX0KCQkJZWxzZQoJCQkJY291dCA8PCAiUSIgPDwgUSsrIDw8ICI6ICIgPDwgc2VndHJlZS5xdWVyeSgxLCAwLCBBLnNpemUoKS0xLCBhLCBiKSA8PCAnXG4nOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoK