Advertisement
apl-mhd

lazyPropagation

Aug 3rd, 2017
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <climits>
  4. using namespace std;
  5.  
  6. int inf = INT_MAX; 
  7.  
  8. int segment[100]={0};
  9. int lazy[100]={0};
  10.  
  11. void constructTree(int number[],int start, int end, int pos){
  12.    
  13.     segment[pos]=0;
  14.    
  15.     if(start == end){
  16.        
  17.         segment[pos] = number[start];
  18.         return;
  19.     }
  20.  
  21.     int mid = (start+end) / 2;
  22.    
  23.     constructTree(number, start, mid, pos*2);
  24.     constructTree(number, mid+1, end, pos*2+1);
  25.    
  26.     segment[pos] = min(segment[pos*2],segment[pos*2+1]);
  27.    
  28. }
  29.  
  30. void updateLazy(int start , int end, int qstart,int qend, int pos, int value ){
  31.    
  32.    
  33.     if(lazy[pos] !=0){
  34.        
  35.        
  36.         segment[pos] +=lazy[pos];
  37.        
  38.         if(start !=end){
  39.            
  40.             lazy[pos*1] +=lazy[pos];
  41.             lazy[pos*2] +=lazy[pos];
  42.            
  43.            
  44.            
  45.             }
  46.         lazy[pos]=0;
  47.        
  48.        
  49.        
  50.         }
  51.    
  52.    
  53.     /*if not in a range*/
  54.    
  55.    
  56.     if(start > end|| start > qend || end < qstart)
  57.         return;
  58.    
  59.    
  60.     /*full range*/
  61.     if(start >= qstart && end<=qend){
  62.        
  63.         segment[pos] +=value;
  64.        
  65.         if(start !=end){
  66.            
  67.             lazy[pos*2] +=value;
  68.             lazy[pos*2+1] +=value;
  69.            
  70.         }
  71.        
  72.     return;
  73.     }
  74.    
  75.     int mid = (start + end)/2;
  76.    
  77.     updateLazy(start, mid, qstart, qend, pos*2, value);
  78.     updateLazy(mid+1,end, qstart, qend, pos*2+1, value);
  79.     segment[pos] =min(segment[pos*2] , segment[pos*2+1]);  
  80. }
  81.    
  82.    
  83.  
  84. int query(int start , int end, int qstart,int qend, int pos, int value ){
  85.    
  86.    
  87.     if(lazy[pos] !=0){
  88.        
  89.        
  90.         segment[pos] +=lazy[pos];
  91.        
  92.         if(start !=end){
  93.            
  94.             lazy[pos*1] +=lazy[pos];
  95.             lazy[pos*2] +=lazy[pos];
  96.            
  97.            
  98.            
  99.             }
  100.         lazy[pos]=0;
  101.        
  102.        
  103.        
  104.         }
  105.    
  106.    
  107.     /*if not in a range*/
  108.    
  109.    
  110.     if(start > end|| start > qend || end < qstart)
  111.         return 99999;
  112.    
  113.    
  114.     /*full range*/
  115.     if(start >= qstart && end<=qend){
  116.        
  117.        
  118.        
  119.         if(start !=end){
  120.            
  121.             lazy[pos*2] +=value;
  122.             lazy[pos*2+1] +=value;
  123.            
  124.         }
  125.         return segment[pos];
  126.     }
  127.    
  128.     int mid = (start + end)/2;
  129.    
  130.     int x = query(start, mid, qstart, qend, pos*2, value);
  131.     int y = query(mid+1,end, qstart, qend, pos*2+1, value);
  132.     return min(x, y);
  133.    
  134.    
  135.    
  136. }
  137.    
  138.    
  139.    
  140.  
  141.    
  142. int query(int start, int end, int qstart, int qend, int pos){
  143.    
  144.    
  145.         if(start >= qstart && end<=qend)
  146.             return segment[pos];
  147.        
  148.            
  149.         if(start > qend || end<qstart)
  150.             return inf;
  151.            
  152.     int mid = (start + end) /2;
  153.     int x = query(start,mid, qstart, qend, pos*2);
  154.     int y = query(mid+1, end, qstart, qend, pos*2+1);
  155.    
  156.     return min(x,y);
  157.    
  158. }
  159.  
  160.  
  161. int main(int argc, char **argv)
  162. {
  163.    
  164.  
  165.     /*                 0  1   2    3   3 5 6  7  */
  166.     int number[8] = {1,2,3,4,5,6,7,-10};
  167.    
  168.     int size = sizeof(number)/sizeof(number[0])-1;
  169.    
  170.  
  171.     constructTree(number,0,size, 1);
  172.    
  173.     updateLazy(0, size, 0,3,1,-20);
  174.    
  175.    
  176.     cout<<query(0,size,0,7,1)<<endl;
  177.    
  178.     for(int i=0; i<15; i++)
  179.         cout<<lazy[i]<<" ";
  180.    
  181.     printf("\n");
  182.    
  183.    
  184.    
  185.     return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement