Advertisement
mahfuj02

Curious Robin Hood

Feb 17th, 2020
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. #define arr_s  100005
  6. int arr[arr_s];
  7. int tree[arr_s * 3];
  8. void init(int node, int b, int e)
  9. {
  10.     if (b == e)
  11.     {
  12.         tree[node] = arr[b];
  13.         return;
  14.     }
  15.     int Left = node * 2;
  16.     int Right = node * 2 + 1;
  17.     int mid = (b + e) / 2;
  18.     init(Left, b, mid);
  19.     init(Right, mid + 1, e);
  20.     tree[node] = tree[Left] + tree[Right];
  21. }
  22. void update(int node, int b, int e, int i, int newvalue)
  23. {
  24.     if (i > e || i < b)
  25.         return;
  26.     if (b >= i && e <= i)
  27.     {
  28.         tree[node] -= newvalue;
  29.         return;
  30.     }
  31.     int Left = node * 2;
  32.     int Right = node * 2 + 1;
  33.     int mid = (b + e) / 2;
  34.     update(Left, b, mid, i, newvalue);
  35.     update(Right, mid + 1, e, i, newvalue);
  36.     tree[node] = tree[Left] + tree[Right];
  37. }
  38. void update1(int node, int b, int e, int i, int newvalue)
  39. {
  40.     if (i > e || i < b)
  41.         return;
  42.     if (b >= i && e <= i)
  43.     {
  44.         tree[node] += newvalue;
  45.         return;
  46.     }
  47.     int Left = node * 2;
  48.     int Right = node * 2 + 1;
  49.     int mid = (b + e) / 2;
  50.     update1(Left, b, mid, i, newvalue);
  51.     update1(Right, mid + 1, e, i, newvalue);
  52.     tree[node] = tree[Left] + tree[Right];
  53. }
  54.  
  55. int query(int node, int b, int e, int i, int j)
  56. {
  57.     if (i > e || j < b)
  58.         return 0;
  59.     if (b >= i && e <= j)
  60.         return tree[node];
  61.     int Left = node * 2;
  62.     int Right = node * 2 + 1;
  63.     int mid = (b + e) / 2;
  64.     int p1 = query(Left, b, mid, i, j);
  65.     int p2 = query(Right, mid + 1, e, i, j);
  66.     return p1 + p2;
  67. }
  68.  
  69. int main()
  70. {
  71.     ios::sync_with_stdio(false);
  72.     cin.tie(0);
  73.     int t;
  74.     scanf("%d",&t);
  75.     int cs=0;
  76.     while(t--)
  77.     {
  78.  
  79.  
  80.         int n,q;
  81.  
  82.         scanf("%d %d",&n,&q);
  83.  
  84.         for(int i = 0; i<n; i++)
  85.         {
  86.             scanf("%d",&arr[i]);
  87.         }
  88.  
  89.         init(1,0,n-1);
  90.  
  91.         printf("Case %d:\n",++cs);
  92.         while(q--)
  93.         {
  94.             int i;
  95.             scanf("%d",&i);
  96.             if(i==1)
  97.             {
  98.                 int v;
  99.                 scanf("%d",&v);
  100.                 //cout<<arr[v]<<endl;
  101.                 printf("%d\n",arr[v]);
  102.                 update(1, 0, n-1, v, arr[v]);
  103.             }
  104.             if(i==2)
  105.             {
  106.                 int j,v;
  107.                 scanf("%d %d",&j,&v);
  108.                 update1(1, 0, n-1, j,v);
  109.             }
  110.             if(i==3)
  111.             {
  112.                 int j,k;
  113.                 scanf("%d %d",&j,&k);
  114.                 int ans = query(1,0,n-1,j,k);
  115.                 printf("%d\n",ans);
  116.  
  117.             }
  118.         }
  119.  
  120.         memset(arr,0,sizeof arr);
  121.     }
  122.  
  123.  
  124.  
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement