Advertisement
hurmawe

Задача №2.2

Feb 20th, 2021
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. //проталкивание вниз
  2. void push_down_1(int x, vector<int>& dop)
  3. {
  4.     if (2 * x + 1 < dop.size())
  5.     {
  6.         dop[2 * x + 1] = dop[x];
  7.         push_down_1(2 * x + 1, dop);
  8.  
  9.         dop[2 * x + 2] = dop[x];
  10.         push_down_1(2 * x + 2, dop);
  11.  
  12.         dop[x] = 0;
  13.     }
  14. }
  15. // увеличение отрезка на х
  16. void dop_plant(int start,const int& x,const int& left,const int& right,int lx,int rx, vector<int>& dop)
  17. {    
  18.         if (left >= rx or lx >= right)
  19.             return;
  20.         if (lx == left and rx == right)
  21.         {
  22.             dop[start] += x;
  23.             return;
  24.         }
  25.         int m = (lx + rx) / 2;
  26.         dop_plant(start * 2 + 1, x, left, right, lx, m, dop);
  27.         dop_plant(start * 2 + 2, x, left, right, m, rx, dop);
  28. }
  29.  
  30. //строительство дерева с учтенным увеличением
  31. vector<int> end_tree(vector<int>& array, vector<int>& dop, int lenght)
  32. {
  33.     for (int i = 0; i < dop.size(); i++)
  34.     {
  35.         if (dop[i] != 0)
  36.         {
  37.             push_down_1(i, dop);
  38.             break;
  39.         }
  40.     }
  41.     if (lenght % 2 == 0)
  42.     {
  43.         vector<int> output(lenght * 2 - 1);
  44.         for (int i = 0; i < lenght; i++)
  45.         {
  46.             output[lenght - 1 + i] = array[i]+dop[lenght-1+i];
  47.         }
  48.         for (int i = lenght - 2; i >= 0; i--)
  49.         {
  50.             output[i] = output[i * 2 + 1] + output[i * 2 + 2];
  51.         }
  52.         return output;
  53.     }
  54.     else
  55.     {
  56.         vector<int> output((lenght + 1) * 2 - 1);
  57.         for (int i = 0; i < lenght; i++)
  58.         {
  59.             output[lenght + i] = array[i] + dop[lenght - 1 + i];
  60.         }
  61.         for (int i = lenght - 1; i >= 0; i--)
  62.         {
  63.             output[i] = output[i * 2 + 1] + output[i * 2 + 2];
  64.         }
  65.         return output;
  66.     }
  67. }
  68. // сумма на отрезке(передается дерево после end_tree)
  69. int sum(int l, int r, int x, int lx, int rx,const vector<int>& array)
  70. {
  71.     if (l >= rx or lx >= r)
  72.         return 0;
  73.     if (lx >= l and rx <= r)
  74.         return array[x];
  75.     int m = (lx + rx) / 2;
  76.     int sl = sum(l, r, 2 * x + 1, lx, m, array);
  77.     int sr = sum(l, r, 2 * x + 2, m, rx, array);
  78.     return sl + sr;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement