Guest User

Untitled

a guest
Mar 31st, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define pi 3.141592654
  5. #define fix(n) cout << fixed << setprecision(n)
  6.  
  7. #define rep(i,a,b) for(int i=a;i<b;i++)
  8. #define ren(i,a,b) for(int i=a;i>=b;i--)
  9.  
  10. #define si(d)  scanf("%d",&d)
  11. #define sll(d) scanf("%lld",&d)
  12. #define pin(d) printf("%d\n",d)
  13. #define pln(d) printf("%lld\n",d)
  14. #define nl     printf("\n")
  15.  
  16. #define ll long long
  17. #define ull unsigned long long
  18.  
  19. #define mp make_pair
  20. #define pb push_back
  21. #define fi first
  22. #define se second
  23.  
  24. #define chalne_de continue
  25. int mod=1000000007;
  26. const int N = 1024005;
  27. int tree[4*N];
  28. int lazy[4*N];
  29. int a[4*N];
  30. ll gcd(ll a , ll b)
  31. {
  32.     if ( b == 0)
  33.     return a;
  34.     return gcd( b, a % b);
  35. }
  36. void build ( int node , int st,int en)
  37. {
  38.     if ( st > en)
  39.         return ;
  40.     if (st == en)
  41.     {
  42.         tree[node] = a[st];
  43.         return ;
  44.     }
  45.     int mid = (st+en) / 2 ;
  46.     build(node*2,st,mid);
  47.     build(node*2+1,mid+1,en);
  48.     tree[node] = tree[node*2] + tree[node*2+1];
  49. }
  50. void update(int node,int st,int en,int l, int r, int ty)
  51. {
  52.     if ( lazy[node] != 0)
  53.     {
  54.         if ( lazy[node] == 1)
  55.             {
  56.                 tree[node] = (en-st+1) - tree[node];
  57.                 if ( st != en)
  58.                 {
  59.                     if ( lazy[node*2] == 1 || lazy[node*2] == 0)
  60.                     lazy[node*2] = 1 - lazy[node*2];
  61.                     else
  62.                         lazy[node*2] = (lazy[node*2] == 2?3:2);
  63.                     if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
  64.                     lazy[node*2+1] = 1 - lazy[node*2+1];
  65.                     else
  66.                         lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
  67.  
  68.  
  69.                 }
  70.             }
  71.             else if ( lazy[node] == 2)
  72.             {
  73.                 tree[node] = (en-st+1);
  74.                 if ( st != en)
  75.                 {
  76.                     lazy[node*2] = 2 ;
  77.                     lazy[node*2+1] = 2;
  78.                 }
  79.             }
  80.             else
  81.             {
  82.                 tree[node] = 0;
  83.                 if ( st != en)
  84.                 {
  85.                     lazy[node*2] = 3 ;
  86.                     lazy[node*2+1] = 3;
  87.                 }
  88.             }
  89.             lazy[node] = 0;
  90.  
  91.     }
  92.     if ( st > en || st > r || en < l)
  93.         return ;
  94.     if ( st >= l && en <= r)
  95.     {
  96.         if  ( ty == 1)
  97.         {
  98.                 tree[node] = (en-st+1) - tree[node];
  99.                 if ( st != en)
  100.                 {
  101.                     if ( lazy[node*2] == 0 || lazy[node*2] == 1)
  102.                     lazy[node*2] = 1 - lazy[node*2];
  103.                     else
  104.                         lazy[node*2] = (lazy[node*2] == 2?3:2);
  105.                     if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
  106.                     lazy[node*2+1] = 1 - lazy[node*2+1];
  107.                     else
  108.                         lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
  109.  
  110.  
  111.                 }
  112.         }
  113.         else if ( ty == 2)
  114.         {
  115.             tree[node] = en - st + 1;
  116.             if ( st != en)
  117.             {
  118.             lazy[node*2] = 2 ;
  119.             lazy[node*2+1] = 2;
  120.             }
  121.         }
  122.         else
  123.         {
  124.             tree[node] = 0;
  125.             if ( st != en)
  126.             {
  127.                 lazy[node*2] = 3 ;
  128.                 lazy[node*2+1] = 3;
  129.             }
  130.         }
  131.         return ;
  132.     }
  133.     int mid = (st+en)/2;
  134.     update(node*2,st,mid,l,r,ty);
  135.     update(node*2+1,mid+1,en,l,r,ty);
  136.     tree[node] =  tree[node*2] + tree[node*2+1];
  137. }
  138. int query(int node,int st,int en,int l,int r)
  139. {
  140.     if ( lazy[node] != 0)
  141.     {
  142.         if ( lazy[node] == 1)
  143.             {
  144.                 tree[node] = (en-st+1) - tree[node];
  145.                 if ( st != en)
  146.                 {
  147.                     if ( lazy[node*2] == 1 || lazy[node*2] == 0)
  148.                     lazy[node*2] = 1 - lazy[node*2];
  149.                     else
  150.                         lazy[node*2] = (lazy[node*2] == 2?3:2);
  151.                     if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
  152.                     lazy[node*2+1] = 1 - lazy[node*2+1];
  153.                     else
  154.                         lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
  155.  
  156.  
  157.                 }
  158.             }
  159.             else if ( lazy[node] == 2)
  160.             {
  161.                 tree[node] = (en-st+1);
  162.                 if ( st != en)
  163.                 {
  164.                     lazy[node*2] = 2 ;
  165.                     lazy[node*2+1] = 2;
  166.                 }
  167.             }
  168.             else
  169.             {
  170.                 tree[node] = 0;
  171.                 if ( st != en)
  172.                 {
  173.                     lazy[node*2] = 3 ;
  174.                     lazy[node*2+1] = 3;
  175.                 }
  176.             }
  177.             lazy[node] = 0;
  178.  
  179.     }
  180.     if ( st > en || st > r || en < l)
  181.         return 0;
  182.     if ( st >= l && en <= r)
  183.         return tree[node];
  184.     int mid = (st+en) / 2 ;
  185.     int p = query(node*2,st,mid,l,r);
  186.     int q = query(node*2+1,mid+1,en,l,r);
  187.     return p + q;
  188. }
  189. int main()
  190. {
  191.     ios::sync_with_stdio(false);
  192.     cin.tie(NULL);
  193.     int t;
  194.     cin >> t ;
  195.     int tc = 1;
  196.     while(t-- )
  197.     {
  198.         memset(tree,0,sizeof(tree));
  199.         memset(lazy,0,sizeof(lazy));
  200.         memset(a,0,sizeof(a));
  201.         int num = 1;
  202.         string s = "";
  203.         cout << "Case "<<tc<<":\n";
  204.         tc++;
  205.         int n ;
  206.         cin >> n ;
  207.        
  208.         rep(i,0,n)
  209.         {
  210.             int cnt;
  211.             cin >> cnt;
  212.             string p ;
  213.             cin >> p ;
  214.             rep(j,0,cnt)
  215.             s += p;
  216.         }
  217.         n = s.length();
  218.         for ( int i =0;i<n;i++)
  219.             a[i] = (s[i] == '1');
  220.         build(1,0,n-1);
  221.         int q ;
  222.         cin >> q ;
  223.         while ( q-- )
  224.         {
  225.             char c ;
  226.             int l ,r  ;
  227.             cin >> c >> l >> r;
  228.             if (c == 'F')
  229.                 update(1,0,n-1,l,r,2);
  230.             else if ( c == 'E')
  231.                 update(1,0,n-1,l,r,3);
  232.             else if ( c == 'I')
  233.                 update(1,0,n-1,l,r,1);
  234.             else
  235.             {
  236.                 int ans = query(1,0,n-1,l,r);
  237.                 cout << "Q"<<num << ": " << ans << endl;
  238.                 num ++;
  239.             }
  240.  
  241.         }
  242.     }
  243.     return 0;
  244. }
Add Comment
Please, Sign In to add comment