Korotkodul

ЗОШ ДО присвоение

Jan 7th, 2022 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 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. #include <optional>
  11. #define pii pair <int,int>
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. void cv(vector <int> &v){
  16.     for (auto x: v) cout<<x<<' ';
  17.     cout<<"\n";
  18. }
  19.  
  20. void cvl(vector <ll> &v){
  21.     for (auto x: v) cout<<x<<' ';
  22.     cout<<"\n";
  23. }
  24.  
  25. int l=0,r=10;
  26. int inter(int tl, int tr){
  27.     if (tl >= l && tr <= r) return 2;
  28.     else if (tr >= l && tl < l) return 1;
  29.     else if (tl <= r && tr > r) return 1;
  30.     else return 0;
  31. }
  32. void cvv(vector <vector <int> > &v){
  33.     for (auto x: v) cv(x);
  34.     cout<<"\n";
  35. }
  36. int n, mxn, K; //mxn - округлена до верхней стпени двойки
  37. //в конце ф-иии build: n = mxn
  38. vector <int> a;
  39. ll inf = 2e9;
  40. struct tree{
  41.     vector <ll> t;
  42.     vector < optional<ll> > to_push;//куда что присвоить
  43.     void bld(){
  44.         mxn = log2(n);
  45.         //cout<<"n mxn = "<<n<<' '<<mxn<<"\n";
  46.         if (pow(2, mxn) < n){
  47.             mxn++;
  48.         }
  49.         mxn = pow(2, mxn);
  50.         t.assign(2  * mxn - 1, -inf);
  51.         to_push.resize(2 * mxn - 1);
  52.         a.resize(mxn, -inf);
  53.         for (int i = 0; i < n; ++i){
  54.             cin>>a[i];
  55.         }
  56.         int id = 2*mxn-2;
  57.         for (int i = mxn-1; i >= 0; --i){
  58.             t[id] = a[i];
  59.             id--;
  60.         }
  61.         for (int i = 2 * mxn - 2; i >= 2; i -= 2){
  62.             t[(i-1)/2]  = t[i] + t[i-1];
  63.         }
  64.         n = mxn;
  65.     }
  66.  
  67.     void sh(){
  68.         cout<<"tree\n";
  69.         cvl(t);
  70.         cout<<"\n\n";
  71.     }
  72.  
  73.  
  74.     void push(int v, int tl, int tr){
  75.         if (!to_push[v]) return;
  76.         int to = 2*v+1;
  77.         int tm  =  (tl + tr) / 2;
  78.         to_push[to] = to_push[v];
  79.         t[to] = to_push[v] * (tm - tl + 1);
  80.         to++;
  81.         to_add[to] += to_add[v];
  82.         t[to] += to_add[v] * (tr - (tm + 1) + 1);
  83.         to_add[v] = 0;
  84.         //t[v] = max(t[to], t[to-1]);
  85.     }
  86.  
  87.     ll get(int v, int tl, int tr){
  88.         //cout<<"tl tr = "<<tl<<' '<<tr<<"\n";
  89.         if (inter(tl, tr) == 0) {
  90.                 //cout<<"not intersect\n";
  91.                 return 0;
  92.         }
  93.         else if (inter(tl, tr) == 2){
  94.             //cout<<"contains\n";
  95.             return t[v];
  96.         }
  97.         else if (inter(tl, tr) == 1){
  98.             //cout<<"partly intersect\n";
  99.             if (to_push[v]) push(v, tl, tr);
  100.             int tm = (tl + tr) / 2;
  101.             return get(v*2+1,tl, tm) + get(2*v+2, tm+1, tr);
  102.         }
  103.     }
  104.  
  105.     void change(int v, int tl, int tr, int val){
  106.         //cout<<"tl tr = "<<tl<<' '<<tr<<"\n";
  107.         if (inter(tl, tr) == 0) {
  108.                 //cout<<"not intersect\n";
  109.                 return;
  110.         }
  111.         else if (inter(tl, tr) == 2){
  112.             //cout<<"contains\n";
  113.             to_add[v] += val;
  114.             t[v] = val * (tr - tl + 1);
  115.         }
  116.         else{
  117.             //cout<<"partly intersect\n";
  118.             int tm = (tl + tr) / 2;
  119.             push(v, tl, tr);
  120.             change(2*v+1, tl, tm, val);
  121.             change(2*v+2, tm+1, tr, val);
  122.             t[v] = t[v*2+1] + t[v*2+2];
  123.         }
  124.     }
  125.  
  126.     void req(){
  127.         char x; cin>>x;
  128.         cin>>l>>r;
  129.         l--; r--;
  130.         //cout<<"request = "<<x<<"\n";
  131.         //cout<<"l r  = "<<l<<" "<<r<<"\n";
  132.         if (x == 'Q'){
  133.             ll res = get(0,0,n-1);
  134.             //cout<<"max("<<l<<","<<r<<") = "<<res<<"\n";
  135.             cout<<res<<' ';
  136.         }else{
  137.             int val; cin>>val;
  138.             //cout<<"val = "<<val<<"\n";
  139.             change(0, 0, n-1, val);
  140.         }
  141.         //sh();
  142.     }
  143. };
  144.  
  145. int main()
  146. {
  147.     ios::sync_with_stdio(0);
  148.     cin.tie(0);
  149.     cout.tie(0);
  150.     cin>>n>>K;
  151.     tree wrk;
  152.     wrk.bld();
  153.     //wrk.sh();
  154.     //int a,b; cin>>a>>b; cout<<inter(a, b);
  155.     for (int i=0;i<K;++i) {
  156.         wrk.req();
  157.     }
  158. }
  159. /*
  160. 5
  161. 2 4 3 1 5
  162. 5
  163. m 1 3
  164. a 2 4 100
  165. m 1 3
  166. a 5 5 10
  167. m 1 5
  168.  
  169. */
  170.  
Add Comment
Please, Sign In to add comment