Advertisement
apl-mhd

segmentTreeSingleUpdateNew

Jul 30th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 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(start==end){
  39.         segment[pos] = value;
  40.         return;
  41.     }
  42.    
  43.    
  44.    
  45.        
  46.        
  47.     int mid = (start + end)/2;
  48.    
  49.      updateSingle(start, mid, pos*2, update, value);
  50.      updateSingle(mid+1, end, pos*2+1, update, value);
  51.    
  52.     segment[pos] = min(segment[pos*2], segment[pos*2+1]);
  53.        
  54.    
  55.    
  56.    
  57. }
  58.    
  59.  
  60.  
  61. int query(int start, int end, int qstart, int qend, int pos){
  62.    
  63.    
  64.         if(start >= qstart && end<=qend)
  65.             return segment[pos];
  66.        
  67.            
  68.         if(start > qend || end<qstart)
  69.             return inf;
  70.            
  71.     int mid = (start + end) /2;
  72.     int x = query(start,mid, qstart, qend, pos*2);
  73.     int y = query(mid+1, end, qstart, qend, pos*2+1);
  74.    
  75.     return min(x,y);
  76.    
  77. }
  78.  
  79.  
  80. int main(int argc, char **argv)
  81. {
  82.    
  83.  
  84.     /*                 0  1   2    3   3 5 6  7  */
  85.     int number[8] = {1,2,3,4,5,6,7,-10};
  86.    
  87.     int size = sizeof(number)/sizeof(number[0])-1;
  88.    
  89.  
  90.     constructTree(number,0,size, 1);
  91.    
  92.    
  93.     //for(int  i=0; i<20; i++)
  94.    
  95.         //cout<<i<<":"<<segment[i]<<" \n";
  96.    
  97.     for(int i=1; i<15; i++)
  98.         cout<<i<<":"<<segment[i]<<" ";
  99.     cout<<endl;
  100.    
  101.     updateSingle(0,7,1, 7, -111111);
  102.    
  103.     for(int i=1; i<15; i++)
  104.         cout<<i<<":"<<segment[i]<<" ";
  105.    
  106.     /*
  107.     cout<<query(0, size, 0, 7,1)<<"\n";
  108.     cout<<query(0, size, 0, 3,1)<<"\n";
  109.     cout<<query(0, size, 4, 7,1)<<"\n";
  110.     cout<<query(0, size, 1, 3,1)<<"\n";
  111.    
  112.     */
  113.    
  114.    
  115.    
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement