Advertisement
saske_7

binary simulation(light oj).cpp

Dec 6th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define mem(x ,  y) memset(x , y ,sizeof x)
  5. #define M 100005
  6.  
  7. typedef long long LL ;
  8. LL arr[M +5] , tree[2*M+5 ] , prop[2*M+5];
  9.  
  10. void build(LL node , LL r1 , LL r2){
  11.  
  12.     if(r1 ==  r2){
  13.         tree[node] = arr[r1];
  14.     return ;
  15.     }
  16.     LL left , right , mid  ;
  17.     left =  2*node;
  18.     right = 2*node +1 ;
  19.     mid =  (r1 + r2 )/2;
  20.  
  21.     build(left , r1 , mid  );
  22.     build(right , mid+1  , r2  );
  23.     tree[node] = tree[left ] + tree[right];
  24.  
  25. }
  26.  
  27. LL query(LL node ,LL r1 , LL r2 , LL i , LL j ,LL  carry){
  28.     if(r1 > j || i > r2 ) return 0;
  29.     if(r1 >= i &&  r2 <= j ){
  30.  
  31.         if(carry&1 )
  32.             return    (r2- r1 +1 )- tree[node];
  33.         else  
  34.             return tree[node];
  35.     }
  36.  
  37.     LL left , right , mid ;
  38.     left =  2*node;
  39.     right = left+1;
  40.     mid = (r1 + r2)/2 ;
  41.    
  42.     LL s1 = query(left , r1 , mid , i , j , carry + prop[node]);
  43.     LL s2 = query(right , mid+1  ,r2 , i , j , carry + prop[node]);
  44.    
  45.     return  s1+s2 ;
  46.  
  47. }
  48.  
  49. void update(LL node ,LL r1 , LL r2 , LL i , LL j ,LL  val ){
  50.     if(r1 > j || i > r2 ) return ;
  51.     if(r1 >= i &&  r2 <= j ){
  52.         prop[node] += val ;
  53.         tree[node] = (r2 - r1 + 1) - tree[node] ;
  54.  
  55.         //do something
  56.         return ;
  57.     }
  58.  
  59.     LL left , right , mid  ;
  60.     left =  2*node;
  61.     right = 2*node +1 ;
  62.     mid =  (r1+r2)/2;
  63.     update(left , r1 , mid , i , j , val );
  64.     update(right , mid+1  , r2 ,i , j , val );
  65.     tree[node] = tree[left ] + tree[right];
  66.  
  67.    
  68.     return ;
  69.  
  70. }
  71.  
  72.  
  73.  
  74. int main(){
  75.    //freopen("in.txt " ,"r",stdin);
  76.    // freopen("out.txt " ,"w",stdout);
  77.  
  78. LL i ,j ,k , tc , cs = 0;
  79.     scanf("%lld",&tc);
  80.  
  81.     while(tc--){
  82.         getchar();
  83.         printf("Case %d:\n", ++cs);
  84.         mem(prop, 0);
  85.  
  86.         char str[M+5];
  87.    
  88.         gets( str);
  89.         k = strlen(str);
  90.         j = 1 ;
  91.  
  92.         for(i = 0; i < k ;i++)
  93.             if(str[i] == '1')
  94.                arr[j++] = 1;
  95.             else
  96.               arr[j++] = 0;
  97.  
  98.         build(1 , 1 , k);
  99.    
  100.         LL qr ;
  101.         scanf("%lld", &qr);
  102.     //  getchar();
  103.  
  104.         while(qr--){
  105.         char s[10];
  106.         scanf("%s",s);
  107.  
  108.             if(s[0] == 'I'){
  109.                 scanf("%lld%lld",&i , &j );
  110.                 update(1 , 1 , k , i ,j ,1 );
  111.        
  112.             }
  113.             else{
  114.                 scanf("%lld",&i );
  115.                 j = query( 1, 1, k , i , i , 0);
  116.                 printf("%lld\n",j );
  117.             }
  118.         }
  119.     }
  120.     return 0 ;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement