Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define FRU freopen("out.txt","w",stdout)
  3. #define FRO freopen("in.txt","r",stdin)
  4. #define pb push_back
  5. #define mp make_pair
  6. #define ff first
  7. #define ss second
  8. #define mem(ara,n) memset(ara,n,sizeof ara)
  9. #define loop(i,j,n) for(i=j;i<n;i++)
  10. #define rloop(i,j,n) for(i=n;i>=j;i--)
  11. #define INF 2147483647
  12. #define ll long long
  13. #define pii pair<int,int>
  14. #define eps 1e-9
  15. #define mii map<int,int>
  16. #define vi vector<int>
  17. #define all(n) n.begin(),n.end()
  18. #define inf INF
  19.  
  20. //const int row[]={-1, -1, -1,  0,  0,  1,  1,  1};  // Kings Move
  21. //const int col[]={-1,  0,  1, -1,  1, -1,  0,  1};  // Kings Move
  22. //const int row[]={-2, -2, -1, -1,  1,  1,  2,  2};  // Knights Move
  23. //const int col[]={-1,  1, -2,  2, -2,  2, -1,  1};  // Knights Move
  24. //const int row[]={-1,0,0,1,0};
  25. //const int col[]={0,-1,1,0,0};
  26. int gcd(int a,int b)
  27. {
  28.     return b==0?a:gcd(b,a%b);
  29. }
  30. int lcm(int a,int b)
  31. {
  32.     return ((a*b)/gcd(a,b));
  33. }
  34.  
  35. /*bool bitcheck(int n,int pos)
  36. {
  37.     return (bool)(n & (1<<pos));
  38. }
  39.  
  40. int biton(int n,int pos)
  41. {
  42.     return n=n or (1<<pos);
  43. }
  44. int bitoff(int n,int pos)
  45. {
  46.     return n=n & ~(1<<pos);
  47. }*/
  48.  
  49. using namespace std;
  50. #define lim 1024000
  51. #define left ps<<1
  52. #define right (ps<<1)+1
  53. #define mid (L+R)>>1
  54.  
  55. //////////////////  END OF TEMPLATE    //////////////////
  56.  
  57. int st[3*lim],lazy[3*lim];
  58. string s;
  59.  
  60. ///st keeps the number of Buccaneer pirates. lazy keep track of current command.
  61.  
  62. void build(int ps,int L,int R)
  63. {
  64.     lazy[ps]=0;
  65.  
  66.     if(L==R)
  67.     {
  68.         if((s[L]-'0')==1)st[ps]=1;
  69.         else st[ps]=0;
  70.         return ;
  71.     }
  72.  
  73.     build(left,L,mid);
  74.     build(right,(mid)+1,R);
  75.  
  76.     st[ps]=st[left]+st[right];
  77. }
  78.  
  79. void up(int ps,int L,int R)/// this function updates lazy and propagate to leaf.
  80. {
  81.     if(lazy[ps]!=0)
  82.     {
  83.         if(L!=R)
  84.         {
  85.             if(lazy[ps]==3)
  86.             {
  87.                 if(lazy[left]==1){lazy[left]=2; }
  88.                 else if(lazy[left]==2)lazy[left]=1;
  89.                 else lazy[left]=3-lazy[left];
  90.  
  91.                 if(lazy[right]==1)lazy[right]=2;
  92.                 else if(lazy[right]==2)lazy[right]=1;
  93.                 else lazy[right]=3-lazy[right];
  94.             }
  95.             else lazy[left]=lazy[right]=lazy[ps];
  96.         }
  97.         if(lazy[ps]==1)st[ps]=(R-L+1);
  98.         else if(lazy[ps]==2)st[ps]=0;
  99.         else st[ps]=(R-L+1)-st[ps];
  100.  
  101.         lazy[ps]=0;
  102.     }
  103. }
  104.  
  105. void update(int ps,int L,int R,int i,int j,int v)
  106. {
  107.     if(L>j|| R<i)return;
  108.     up(ps,L,R);
  109.  
  110.     if(L>=i&& R<=j)
  111.     {
  112.         lazy[ps]=v;
  113.     }
  114.     else
  115.     {
  116.         update(left,L,mid,i,j,v);
  117.         update(right,(mid)+1,R,i,j,v);
  118.     }
  119. }
  120.  
  121. int query(int ps,int L,int R,int i,int j)
  122. {
  123.     if(L>j|| R<i)return 0;
  124.     up(ps,L,R);
  125.  
  126.     if(L>=i&& R<=j)
  127.     {
  128.         return st[ps];
  129.     }
  130.  
  131.     int ls=query(left,L,mid,i,j);
  132.     int rs=query(right,(mid)+1,R,i,j);
  133.  
  134.     return ls+rs;
  135. }
  136.  
  137. void check(int ps,int L,int R,int i,int j)/// this function is just for debuging
  138. {
  139.     if(L>j|| R<i)return;
  140.     up(ps,L,R);
  141.  
  142.     if(L==R)printf("%d",st[ps]);
  143.     else
  144.     {
  145.         check(left,L,mid,i,j);
  146.         check(right,(mid)+1,R,i,j);
  147.     }
  148. }
  149.  
  150. int main()
  151. {
  152.     FRO;
  153. //FRU;
  154. //std::ios_base::sync_with_stdio(false);
  155.     int a,b,c,i,j,k,tc,t;
  156.     int n,m,cnt=0,len;
  157.     string s1;
  158.  
  159.     scanf("%d",&tc);
  160.  
  161.     for(t=1; t<=tc; t++)
  162.     {
  163.         s="";
  164.         scanf("%d",&n);
  165.  
  166.         for(i=0; i<n; i++)
  167.         {
  168.             scanf("%d",&m);
  169.             cin>>s1;
  170.             for(j=0; j<m; j++)s+=s1;
  171.         }
  172.         len=s.length();
  173.         build(1,0,len-1);
  174.         printf("Case %d:\n",t);
  175.         scanf("%d",&n);
  176.         char s[10];
  177.         j=1;
  178.         for(i=0; i<n; i++)
  179.         {
  180.             scanf("%s%d%d",s,&a,&b);
  181.             if(s[0]=='F')update(1,0,len-1,a,b,1);
  182.             else if(s[0]=='E')update(1,0,len-1,a,b,2);
  183.             else if(s[0]=='I')update(1,0,len-1,a,b,3);
  184.             else
  185.             {
  186.                 check(1,0,len-1,0,len-1);printf("\n");
  187.                 printf("Q%d: %d\n",j++,query(1,0,len-1,a,b));
  188.  
  189.             }
  190.         }
  191.  
  192.     }
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement