apl-mhd

segmentTreeSingleUpdate

Jul 30th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <climits>
  4. using namespace std;
  5.  
  6.  
  7.  
  8. int inf = INT_MAX; 
  9.  
  10. int segment[100]={0};
  11.  
  12. void constructTree(int number[],int start, int end, int pos){
  13.    
  14.     segment[pos]=0;
  15.    
  16.     if(start == end){
  17.        
  18.         segment[pos] = number[start];
  19.         return;
  20.     }
  21.  
  22.     int mid = (start+end) / 2;
  23.    
  24.     constructTree(number, start, mid, pos*2);
  25.     constructTree(number, mid+1, end, pos*2+1);
  26.    
  27.     segment[pos] = min(segment[pos*2],segment[pos*2+1]);
  28.    
  29.    
  30.    
  31.     }
  32.    
  33. void updateSingle(int start, int end, int pos, int update, int value){
  34.    
  35.     if(update < start || end < update)
  36.         return;
  37.        
  38.     if(update == start && update == end){
  39.    
  40.         segment[pos] = value;
  41.         return;
  42.     }
  43.    
  44.    
  45.    
  46.     if(start == end)
  47.         return;
  48.        
  49.        
  50.     int mid = (start + end)/2;
  51.    
  52.      updateSingle(start, mid, pos*2, update, value);
  53.      updateSingle(start, mid, pos*2, update, value);
  54.    
  55.     segment[pos] = min(segment[pos*2], segment[pos*2+1]);
  56.        
  57.    
  58.    
  59.    
  60. }
  61.    
  62.  
  63.  
  64. int query(int start, int end, int qstart, int qend, int pos){
  65.    
  66.    
  67.         if(start >= qstart && end<=qend)
  68.             return segment[pos];
  69.        
  70.            
  71.         if(start > qend || end<qstart)
  72.             return inf;
  73.            
  74.     int mid = (start + end) /2;
  75.     int x = query(start,mid, qstart, qend, pos*2);
  76.     int y = query(mid+1, end, qstart, qend, pos*2+1);
  77.    
  78.     return min(x,y);
  79.    
  80. }
  81.  
  82.  
  83. int main(int argc, char **argv)
  84. {
  85.    
  86.  
  87.     /*                 0  1   2    3   3 5 6  7  */
  88.     int number[8] = {1,2,3,4,5,6,7,8};
  89.    
  90.     int size = sizeof(number)/sizeof(number[0])-1;
  91.    
  92.  
  93.     constructTree(number,0,size, 1);
  94.    
  95.    
  96.     //for(int  i=0; i<20; i++)
  97.    
  98.         //cout<<i<<":"<<segment[i]<<" \n";
  99.    
  100.     for(int i=1; i<15; i++)
  101.         cout<<i<<":"<<segment[i]<<" ";
  102.     cout<<endl;
  103.    
  104.     updateSingle(0,7,1, 0, -111111);
  105.    
  106.     for(int i=1; i<15; i++)
  107.         cout<<i<<":"<<segment[i]<<" ";
  108.    
  109.     /*
  110.     cout<<query(0, size, 0, 7,1)<<"\n";
  111.     cout<<query(0, size, 0, 3,1)<<"\n";
  112.     cout<<query(0, size, 4, 7,1)<<"\n";
  113.     cout<<query(0, size, 1, 3,1)<<"\n";
  114.    
  115.     */
  116.    
  117.    
  118.    
  119.     return 0;
  120. }
Add Comment
Please, Sign In to add comment