Advertisement
Korotkodul

ЗОШ ДО 2

Jan 7th, 2022 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. using namespace std;
  12. using ll = long long;
  13. using ld = long double;
  14. void cv(vector <int> &v){
  15.     for (auto x: v) cout<<x<<' ';
  16.     cout<<"\n";
  17. }
  18.  
  19. void cvl(vector <ll> &v){
  20.     for (auto x: v) cout<<x<<' ';
  21.     cout<<"\n";
  22. }
  23.  
  24. int l=0,r=10;
  25. int inter(int tl, int tr){
  26.     if (tl >= l && tr <= r) return 2;
  27.     else if (tr >= l && tl < l) return 1;
  28.     else if (tl <= r && tr > r) return 1;
  29.     else return 0;
  30. }
  31. void cvv(vector <vector <int> > &v){
  32.     for (auto x: v) cv(x);
  33.     cout<<"\n";
  34. }
  35. int n;
  36. vector <int> a;
  37.  
  38. struct tree{
  39.     vector <ll> t;
  40.     vector <ll> to_add;
  41.     void bld(){
  42.         int mxn = log2(n);
  43.         cout<<"n mxn = "<<n<<' '<<mxn<<"\n";
  44.         if (pow(2, mxn) < n){
  45.             mxn++;
  46.         }
  47.         mxn = pow(2, mxn);
  48.         t.assign(2  * mxn - 1, 0);
  49.         to_add.assign(2 * mxn - 1, 0);
  50.         a.resize(mxn);
  51.         for (int i = 0; i < n; ++i){
  52.             cin>>a[i];
  53.         }
  54.         int id = 2*mxn-2;
  55.         for (int i = mxn-1; i >= 0; --i){
  56.             t[id] = a[i];
  57.             id--;
  58.         }
  59.         for (int i = 2 * mxn - 2; i >= 2; i -= 2){
  60.             t[(i-1)/2]  = t[i] + t[i-1];
  61.         }
  62.     }
  63.  
  64.     void sh(){
  65.         cout<<"tree\n";
  66.         cvl(t);
  67.     }
  68.  
  69.  
  70.     void push(int v, int tl, int tr){
  71.         if (to_add[v] == 0) return;
  72.         int to = 2*v+1;
  73.         int tm  =  (tl + tr) / 2;
  74.         to_add[to] += to_add[v];
  75.         t[to] += to_add[v] * (tm - tl + 1);
  76.         to++;
  77.         to_add[to] = to_add[v];
  78.         t[to] = to_add[v] * (tr - (tm + 1) + 1);
  79.         to_add[v] = 0;
  80.     }
  81.  
  82.  
  83.     ll get(int v, int tl, int tr){
  84.         if (inter(tl, tr) == 0) return 0;
  85.         else if (inter(tl, tr) == 2){
  86.             return t[v];
  87.         }
  88.         else if (inter(tl, tr) == 1){
  89.             push(v, tl, tr);
  90.             int tm = (tl + tr) / 2;
  91.             return get(v*2+1,tl, tm) + get(2*v+2, tm+1, tr);
  92.         }
  93.     }
  94.  
  95.     void add(int v, int tl, int tr, int val){
  96.         if (inter(tl, tr) == 0) return;
  97.         else if (inter(tl, tr) == 2){
  98.             to_add[v] += val;
  99.             t[v] += val * (tr - tl + 1);
  100.         }
  101.         else{
  102.             int tm = (tl + tr) / 2;
  103.             add(2*v+1, tl, tm, val);
  104.             add(2*v+2, tm+1, tr, val);
  105.         }
  106.     }
  107.  
  108.     void req(){
  109.         char x; cin>>x;
  110.         cin>>l>>r;
  111.         if (x == 'm'){
  112.             cout<<get(0,l,r);
  113.         }else{
  114.             int val; cin>>val;
  115.             add(0, 0, n-1, val);
  116.         }
  117.     }
  118. };
  119.  
  120. int main()
  121. {
  122.     ios::sync_with_stdio(0);
  123.     cin.tie(0);
  124.     cout.tie(0);
  125.     cin>>n;
  126.     tree wrk;
  127.     wrk.bld();
  128.     wrk.sh();
  129.     //int a,b; cin>>a>>b; cout<<inter(a, b);
  130.  
  131. }
  132. /*
  133. 5
  134. 2 4 3 1 5
  135. 5
  136. m 1 3
  137. a 2 4 100
  138. m 1 3
  139. a 5 5 10
  140. m 1 5
  141.  
  142. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement