Advertisement
apl-mhd

Curious Robin Hood

Apr 16th, 2017
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <string.h>
  6. using namespace std;
  7.  
  8. #define MAX 100010
  9.  
  10.  
  11. void tree(int input[],int segTree[], int low, int high, int pos){
  12.    
  13.         if(low == high){
  14.             segTree[pos] = input[low];
  15.             return;
  16.         }
  17.        
  18.         int mid = (low+high) /2;
  19.        
  20.         tree(input, segTree, low, mid, 2*pos+1);
  21.         tree(input, segTree, mid+1, high, 2*pos+2);
  22.        
  23.         segTree[pos] = segTree[2*pos+1] + segTree[2*pos+2];
  24.    
  25.     }
  26.    
  27.  
  28. long long query(int segTree[], int qlow, int qhigh, int low, int high, int pos){
  29.        
  30.         if(qlow<= low && qhigh>=high)
  31.            
  32.             return segTree[pos];
  33.            
  34.         if(qlow > high || qhigh<low)
  35.             return 0;
  36.        
  37.         int mid  = (low+high) /2;
  38.        
  39.        
  40.     long long p1 = query(segTree, qlow, qhigh, low, mid, 2*pos+1);
  41.     long long p2 = query(segTree, qlow, qhigh, mid+1, high, 2*pos+2);
  42.    
  43.     return p1 + p2;    
  44.        
  45. }      
  46.  
  47. void update( int segTree[], int node, int b, int e, int i, int newvalue)
  48. {
  49.     if (i > e || i < b)
  50.         return;
  51.     if (b >= i && e <= i) {
  52.        
  53.         if( newvalue == 0){
  54.            
  55.             printf("%d\n",segTree[node]);
  56.             segTree[node] = 0;
  57.         }
  58.         else     
  59.             segTree[node] += newvalue;
  60.         return;
  61.     }
  62.     int mid = (b + e) / 2;
  63.     update(segTree, node*2+1, b, mid, i, newvalue);
  64.     update(segTree, node*2+2, mid + 1, e, i, newvalue);
  65.  
  66.     segTree[node] = segTree[node*2+1] + segTree[node*2+2];
  67.    
  68. }
  69.  
  70.  
  71.    
  72.  
  73. int main(int argc, char **argv)
  74. {
  75.     int t, Case=0;
  76.     scanf("%d",&t);
  77.    
  78.     while(t--){
  79.        
  80.     int number[MAX];
  81.    
  82.     int i,n, q, segTree[MAX*3]= {0};
  83.    
  84.     scanf("%d%d",&n,&q);
  85.     for(i= 0; i<n; i++){
  86.        
  87.         scanf("%d",&number[i]);
  88.    
  89.        
  90.         }
  91.    
  92.     tree(number, segTree, 0, n-1, 0);
  93.    
  94.     Case++;
  95.     printf("Case %d:\n", Case);
  96.  
  97.     for(i=0; i<q; i++){
  98.         int x, y, z;
  99.        
  100.        
  101.         scanf("%d",&x);
  102.         if(x== 1){
  103.            
  104.             scanf("%d",&y);    
  105.             update( segTree, 0, 0, n-1, y, 0);
  106.            
  107.             }
  108.        
  109.         else if(x == 2){
  110.            
  111.                 scanf("%d%d",&y,&z);
  112.                 update( segTree, 0, 0, n-1, y, z);
  113.            
  114.             }
  115.         else{
  116.            
  117.                 scanf("%d%d",&y,&z);
  118.                 printf("%lld\n",query(segTree,y,z,0, n-1,0));
  119.                 //cout<<query(segTree,y,z,0, n-1,0)<<endl;         
  120.            
  121.             }
  122.            
  123.     }
  124.    
  125. }
  126.        
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement