Advertisement
Guest User

getSum()

a guest
Mar 31st, 2020
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. size_t getSum(int l, int r) {
  2.     unsigned long long int diff = 0;
  3.     int left_boundary = 0;
  4.     int right_boundary = n_keys_;
  5.    
  6.     int i = 0;
  7.     while(i < n_keys_ && keys_[i] < l) {
  8.       ++i;
  9.     }
  10.     if(i == n_keys_) { //fully outside range from the left
  11.       if(leaf_) {
  12.         return 0;
  13.       }
  14.       return children_[n_keys_]->getSum(l, r);
  15.     }
  16.     left_boundary = i;
  17.  
  18.     i = n_keys_ - 1;
  19.     while(i >= 0 && keys_[i] > r) {
  20.       --i;
  21.     }
  22.     if(i == -1) {
  23.       if(leaf_){
  24.         return 0; //fully outside range from the right
  25.       }
  26.       return children_[0]->getSum(l, r);
  27.     }
  28.     right_boundary = i;
  29.  
  30.     if(keys_[0] >= l && keys_[n_keys_ - 1] <=r) // fully inside range
  31.     {
  32.       if(leaf_) {
  33.         return sub_sum;
  34.       }
  35.       diff += children_[0]->sub_sum - children_[0]->getSum(l, r);
  36.       diff += children_[n_keys_]->sub_sum - children_[n_keys_]->getSum(l, r);
  37.       return sub_sum - diff;
  38.     }
  39.  
  40.     if(right_boundary < left_boundary) {
  41.       if(leaf_){
  42.         return 0;
  43.       }
  44.       return children_[left_boundary]->getSum(l, r);
  45.     }
  46.  
  47.     for(int i = 0; i < left_boundary; ++i) {
  48.       diff += keys_[i];
  49.       if(!leaf_) {
  50.         diff += children_[i]->sub_sum;
  51.       }
  52.     }
  53.     for(int i = n_keys_ - 1; i > right_boundary; --i) {
  54.       diff += keys_[i];
  55.       if(!leaf_) {
  56.         diff += children_[i + 1]->sub_sum;
  57.       }
  58.     }
  59.  
  60.     if(!leaf_) {
  61.       diff += children_[left_boundary]->sub_sum - children_[left_boundary]->getSum(l, r);
  62.       diff += children_[right_boundary + 1]->sub_sum - children_[right_boundary + 1]->getSum(l, r);
  63.     }
  64.     return sub_sum - diff;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement