Advertisement
shamiul93

LightOJ - 1112 - Curious Robin Hood

Apr 7th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. /**
  2.  
  3. @author - Rumman BUET CSE'15
  4. Problem - 1112 - Curious Robin Hood
  5.  
  6. Concept -
  7. * Segment Tree.
  8. ** It's a complete tutorial problem to how to implement basic segment tree.
  9.  
  10. */
  11.  
  12. #include <bits/stdc++.h>
  13. #define ll                                      long long
  14. #define fi                                      freopen("in.txt", "r", stdin)
  15. #define fo                                      freopen("out.txt", "w", stdout)
  16. #define m0(a) memset(a , 0 , sizeof(a))
  17. #define m1(a) memset(a , -1 , sizeof(a))
  18.  
  19. using namespace std;
  20.  
  21. int *arr, *seg ;
  22. int n, q, v, idx, st, en  ;
  23.  
  24.  
  25. int update( int lo, int hi, int sp, int value)
  26. {
  27.     if(hi < idx || lo > idx)
  28.     {
  29.         return 0 ;
  30.     }
  31.     if(lo == idx && hi == idx)
  32.     {
  33.         seg[sp] = value ;
  34.         return seg[sp] ;
  35.     }
  36.  
  37.     ll mid, left, right;
  38.  
  39.     mid = (lo+hi) / 2 ;
  40.  
  41.     left = 2*sp + 1 ;
  42.     right  =  2*sp+2 ;
  43.  
  44.     update(lo, mid, left, value) ;
  45.     update(mid+1, hi, right, value) ;
  46.  
  47.     seg[sp] = seg[left] + seg[right] ;
  48.     return seg[sp] ;
  49. }
  50.  
  51. //int update(int lo, int hi, int sp , int val)
  52. //{
  53. //    if(lo == idx && hi == idx)
  54. //    {
  55. //        seg[sp] = val ;
  56. //        return seg[sp] ;
  57. //    }
  58. //    if(lo == hi)
  59. //    {
  60. //        return seg[sp] ;
  61. //    }
  62. //
  63. //    ll mid ;
  64. //    mid = (lo + hi) / 2 ;
  65. //
  66. //    seg[sp] = update(lo, mid, 2*sp + 1 , val) + update(mid+1, hi, 2*sp + 2 , val) ;
  67. //    return seg[sp] ;
  68. //}
  69.  
  70. int querysum( int lo, int hi,int sp)
  71. {
  72.     if( hi < st || lo > en)
  73.     {
  74.         return 0 ;
  75.     }
  76.     if( lo >= st && hi <= en)
  77.     {
  78.         return seg[sp] ;
  79.     }
  80.  
  81.     ll mid ;
  82.     mid = (lo+hi) / 2 ;
  83.     return querysum(lo, mid, 2*sp+1) + querysum(mid+1, hi, 2*sp+2) ;
  84. }
  85.  
  86. int conseg(int lo, int hi, int sp)
  87. {
  88.     if(lo == hi)
  89.     {
  90.         seg[sp] = arr[lo] ;
  91.         return seg[sp] ;
  92.     }
  93.  
  94.     ll mid ;
  95.     mid = (lo + hi) / 2 ;
  96.  
  97.     seg[sp] = conseg(lo, mid, 2*sp + 1) + conseg(mid+1, hi, 2*sp + 2) ;
  98.     return seg[sp] ;
  99. }
  100.  
  101.  
  102. void initseg()
  103. {
  104.     ll x ;
  105.     x = ceil(log2(n)) + 1 ;
  106.     ll len ;
  107.     len = pow(2,x)-1 ;
  108.     seg = new int[len + 10] ;
  109.     for(ll i = 0 ; i < len+10 ; i++)
  110.     {
  111.         seg[i] = 0 ;
  112.     }
  113.     conseg(0, n-1, 0);
  114. }
  115.  
  116.  
  117. int main()
  118. {
  119. //    fi ;
  120. //    fo ;
  121.     ll T, t = 0 ;
  122.     scanf("%lld",&T);
  123.     while(T--)
  124.     {
  125.         t++ ;
  126.  
  127.         scanf("%d %d",&n, &q) ;
  128.         arr = new int[n+10] ;
  129.  
  130.  
  131.         for(ll i = 0 ; i < n ; i++)
  132.         {
  133.             scanf("%d",&arr[i]) ;
  134.         }
  135.         initseg() ;
  136.  
  137.  
  138.  
  139.         printf("Case %d:\n",t);
  140.  
  141.         while(q--)
  142.         {
  143.             ll cs ;
  144.             scanf("%lld",&cs) ;
  145.             if(cs == 1)
  146.             {
  147.                 scanf("%d",&idx);
  148.  
  149.                 update(0, n-1, 0, 0) ;
  150.                 printf("%d\n",arr[idx]) ;
  151.                 arr[idx] = 0 ;
  152.             }
  153.             else if(cs == 2)
  154.             {
  155.                 scanf("%d %d",&idx, &v);
  156.                 arr[idx] = arr[idx] + v ;
  157.                 update(0, n-1, 0, arr[idx]) ;
  158.             }
  159.             else
  160.             {
  161.                 scanf("%d %d",&st, &en) ;
  162.                 int ans ;
  163.                 ans = querysum(0, n-1, 0) ;
  164.                 printf("%d\n",ans) ;
  165.             }
  166.         }
  167.     }
  168.     return 0 ;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement