Advertisement
Korotkodul

ЗОШ ДО 3

Jan 7th, 2022
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 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. ll inf = 2e9;
  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, -inf);
  49.         to_add.assign(2 * mxn - 1, 0);
  50.         a.resize(mxn, -inf);
  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]  = max(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];
  76.         to++;
  77.         to_add[to] += to_add[v];
  78.         t[to] += to_add[v];
  79.         to_add[v] = 0;
  80.     }
  81.  
  82.  
  83.     ll get(int v, int tl, int tr){
  84.         if (inter(tl, tr) == 0) return -inf;
  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 max(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;
  100.         }
  101.         else{
  102.             int tm = (tl + tr) / 2;
  103.             push(v, tl, tr);
  104.             add(2*v+1, tl, tm, val);
  105.             add(2*v+2, tm+1, tr, val);
  106.             t[v] = max(t[v*2+1], t[v*2+2]);
  107.         }
  108.     }
  109.  
  110.     void req(){
  111.         char x; cin>>x;
  112.         cin>>l>>r;
  113.         l--; r--;
  114.         cout<<"request = "<<x<<"\n";
  115.         if (x == 'm'){
  116.             cout<<"max("<<l<<","<<r<<") = "<<get(0,l,r)<<"\n";
  117.         }else{
  118.             int val; cin>>val;
  119.             add(0, 0, n-1, val);
  120.         }
  121.         sh();
  122.     }
  123. };
  124.  
  125. int main()
  126. {
  127.     ios::sync_with_stdio(0);
  128.     cin.tie(0);
  129.     cout.tie(0);
  130.     cin>>n;
  131.     tree wrk;
  132.     wrk.bld();
  133.     //wrk.sh();
  134.     //int a,b; cin>>a>>b; cout<<inter(a, b);
  135.     int q; cin>>q; for (int i=0;i<q;++i) {
  136.         wrk.req();
  137.     }
  138.  
  139. }
  140. /*
  141. 5
  142. 2 4 3 1 5
  143. 5
  144. m 1 3
  145. a 2 4 100
  146. m 1 3
  147. a 5 5 10
  148. m 1 5
  149.  
  150. */
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement