Advertisement
Guest User

11402

a guest
Sep 30th, 2012
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.70 KB | None | 0 0
  1. /* CPP Tempelate
  2.  * @author Devashish Tyagi
  3.  */
  4.  
  5. #include <algorithm>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. #include <cstring>
  11. #include <iostream>
  12. #include <map>
  13. #include <queue>
  14. #include <set>
  15. #include <sstream>
  16. #include <stack>
  17. #include <string>
  18. #include <vector>
  19. #include <list>
  20.  
  21. #define s(a) scanf("%d",&a)
  22. #define ss(a,b) scanf("%d %d",&a,&b)
  23. #define p(a) printf("%d\n",a)
  24. #define tr(container, it) for(typeof(container.begin()) it = container.begin(); it != container.end(); it++)
  25. #define pi pair<int,int>
  26. #define vi vector<int>
  27. #define all(v) v.begin(),v.end()
  28.  
  29. #define PB push_back
  30. #define MP make_pair
  31. #define sz(a) (int)(a).size()
  32.  
  33. #define FOR(i,a,b) for(int (i) = (a); (i) < (b); ++(i))  
  34. #define RFOR(i,a,b) for(int (i) = (a)-1; (i) >= (b); --(i))  
  35. #define CLEAR(a) memset((a),0,sizeof(a))
  36.  
  37. #define INF 100000000
  38. #define PI 2*acos(0.0)
  39.  
  40. using namespace std;
  41. typedef long long ll;
  42.  
  43. string convertInt(int number)
  44. {
  45.    stringstream ss;//create a stringstream
  46.    ss << number;//add number to the stream
  47.    return ss.str();//return a string with the contents of the stream
  48. }
  49.  
  50. int convertString(string s){
  51.     int num;
  52.     stringstream sstr(s); // create a stringstream
  53.     sstr>>num; // push the stream into the num
  54.     return num;
  55. }
  56.  
  57. class Node{
  58. public:
  59.     char upd;
  60.     // 0 - Buccaneer pirates
  61.     // 1 - Barbary pirates
  62.     int p[2];
  63.     Node(){
  64.         CLEAR(p);
  65.         upd = ' ';
  66.     }
  67.     void update(char cmd){
  68.         if (cmd == 'I'){
  69.             switch(upd){
  70.                 case ' ': upd = 'I';break;
  71.                 case 'I': upd = ' ';break;
  72.                 case 'E': upd = 'F';break;
  73.                 case 'F': upd = 'E';break;
  74.             }
  75.         }
  76.         else if (cmd != ' '){
  77.             upd = cmd;
  78.         }
  79.     }
  80.     void S(){
  81.         //cout<<"before"<<upd<<" "<<p[0]<<" "<<p[1]<<endl;
  82.         int temp;
  83.         switch(upd){
  84.             case 'I': temp=p[0]; p[0]=p[1]; p[1]=temp; break;
  85.             case 'E': p[1]+=p[0]; p[0]=0; break;
  86.             case 'F': p[0]+=p[1]; p[1]=0; break;
  87.         }
  88.         upd = ' ';
  89.         //cout<<"after"<<upd<<" "<<p[0]<<" "<<p[1]<<endl;
  90.     }
  91. };
  92.  
  93. vector<Node> tree(2048100);
  94. char pirates[1024001];
  95.  
  96. void buildTree(int index, int i, int j){
  97.     if (i>j)
  98.         return;
  99.     if (i==j){
  100.         if (pirates[i] == '0'){
  101.             tree[index].p[1] = 1;
  102.             tree[index].p[0] = 0;
  103.         }
  104.         else{
  105.             tree[index].p[0] = 1;
  106.             tree[index].p[1] = 0;
  107.         }
  108.         tree[index].upd = ' ';
  109.         return;
  110.     }
  111.     int mid = (i+j)/2;
  112.     buildTree(2*index+1,i,mid);
  113.     buildTree(2*index+2,mid+1,j);
  114.     tree[index].p[0] = tree[2*index+1].p[0] + tree[2*index+2].p[0];
  115.     tree[index].p[1] = tree[2*index+1].p[1] + tree[2*index+2].p[1];
  116.     tree[index].upd = ' ';
  117. }
  118.  
  119. void update(int index,int i,int j,int l,int r,char c){
  120.     if (i == l && j == r){
  121.         tree[index].update(c);
  122.     }
  123.     tree[2*index+1].update(tree[index].upd);
  124.     tree[2*index+2].update(tree[index].upd);
  125.     tree[index].S();
  126.     if (i == l && j ==r)
  127.         return;
  128.     if (l>j || r<i || l > r)
  129.         return;
  130.     int mid = (i+j)/2;
  131.     update(2*index+1,i,mid,l,min(r,mid),c);
  132.     update(2*index+2,mid+1,j,max(l,mid+1),r,c);
  133.     tree[index].p[0] = tree[2*index+1].p[0] + tree[2*index+2].p[0];
  134.     tree[index].p[1] = tree[2*index+1].p[1] + tree[2*index+2].p[1];
  135. }
  136.  
  137. int query(int index,int i,int j,int l,int r){
  138.     if (l>j || r<i)
  139.         return 0;
  140.     tree[2*index+1].update(tree[index].upd);
  141.     tree[2*index+2].update(tree[index].upd);
  142.     tree[index].S();
  143.     if (i == l && j == r){
  144.         return tree[index].p[0];
  145.     }
  146.     int mid = (i+j)/2;
  147.     int b1 = query(2*index+1,i,mid,l,min(mid,r));
  148.     int b2 = query(2*index+2,mid+1,j,max(mid+1,l),r);
  149.     return b1+b2;
  150. }
  151.  
  152. int main(void){
  153.     int t;
  154.     cin>>t;
  155.     FOR(z,0,t){
  156.         //CLEAR(tree);
  157.         //CLEAR(pirates);
  158.         int m,len=0,t,q,querycnt=1;
  159.         char str[64];
  160.         s(m);
  161.         FOR(i,0,m){
  162.             cin>>t>>str;
  163.             FOR(j,0,t){
  164.                 int length = strlen(str);
  165.                 FOR(k,0,length){
  166.                     pirates[len] = str[k];
  167.                     len++;
  168.                 }
  169.             }
  170.         }
  171.         buildTree(0,0,len-1);
  172.         cin>>q;
  173.         printf("Case %d:\n",z+1);
  174.         FOR(i,0,q){
  175.             char cmd;
  176.             int l,r;
  177.             cin>>cmd>>l>>r;
  178.             if (cmd == 'S'){
  179.                 int ans = query(0,0,len-1,l,r);
  180.                 printf("Q%d: %d\n",querycnt++,ans);
  181.             }
  182.             else{
  183.                 update(0,0,len-1,l,r,cmd);
  184.             }
  185.         }
  186.     }
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement