Advertisement
Korotkodul

ДО 2

Aug 13th, 2022
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 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. #define vec vector
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v){
  17.     for (auto x: v) cout<<x<<' ';
  18.     cout<<"\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v){
  22.     for (auto x: v) cout<<x<<' ';
  23.     cout<<"\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v){
  28.     for (auto x: v) cv(x);
  29.     cout<<"\n";
  30. }
  31.  
  32. void cvb(vector <bool> v){
  33.     for (bool x: v) cout<<x<<' ';
  34.     cout<<"\n";
  35. }
  36.  
  37. void cvs(vector <string>  v){
  38.     for (auto a: v){
  39.         cout<<a<<"\n";
  40.     }
  41. }
  42.  
  43. void cvp(vector <pii> a){
  44.     for (auto p: a){
  45.         cout<<p.first<<' '<<p.second<<"\n";
  46.     }
  47.     cout<<"\n";
  48. }
  49.  
  50. bool sh = 1;
  51.  
  52. int n,N;
  53.  
  54. struct nd{
  55.     int mxl;
  56.     int Li, Ll;
  57.     int Ri, Rl;
  58. };
  59.  
  60. void see(nd k){
  61.     cout<<k.mxl<<" "<<k.Li<<" "<<k.Ll<<" "<<k.Ri<<" "<<k.Rl<<"\n";
  62. }
  63.  
  64. struct tree{
  65.     vector <nd> v;
  66.    
  67.    
  68.     void mk(int i){//сделать узел на основе двух сыновей - make
  69.         int un = -1;
  70.         v[i].Li = min(v[i*2 + 1].Li, v[i*2 + 2].Li);
  71.         v[i].Ll = v[2 * i + 1].Ll;
  72.         if (v[i].Ll == 0){
  73.             v[i].Ll = v[2 * i + 2].Ll;
  74.         }
  75.         v[i].Ri = max(v[i*2 + 1].Ri, v[i*2 + 2].Ri);
  76.         v[i].Rl = v[2 * i + 2].Rl;
  77.         if (v[i].Rl == 0){
  78.             v[i].Rl = v[2 * i + 1].Rl;
  79.         }
  80.         v[i].mxl = max(v[i * 2 + 1].mxl, v[i * 2 + 2].mxl);
  81.        
  82.         if (v[i * 2 + 1].Ri + 1 == v[i * 2 + 2].Li){
  83.             un = v[i * 2 + 1].Rl + v[i * 2 + 2].Ll;
  84.             //v[i].mxl = max(un, v[i].mxl);
  85.             if (un > v[i].mxl){
  86.  
  87.                 v[i].mxl = un;
  88.                 if (sh){
  89.                     cout<<"un\n";
  90.                     cout<<"id = "<<i<<"\n";
  91.                     see(v[i * 2 + 1]);
  92.                     see(v[i * 2 + 2]);
  93.                 }
  94.             }
  95.  
  96.             //учесть - если объединили с краев
  97.             if ( v[2*i + 1].Li + v[2 * i + 1].Ll - 1 == v[2 * i + 1].Ri){//слева только одна п-ть 0й
  98.                  v[i].Ll =  v[2 * i + 1].Rl + v[2 * i + 2].Ll;
  99.             }
  100.             if ( v[2*i + 2].Li + v[2 * i + 2].Ll - 1 == v[2 * i + 2].Ri){//слева только одна п-ть 0й
  101.                  v[i].Rl =  v[2 * i + 1].Rl + v[2 * i + 2].Ll;
  102.             }
  103.  
  104.         }
  105.     }
  106.    
  107.     void bld(){
  108.         cin>>n;
  109.         N = log2(n);
  110.         if (pow(2, N) < n){
  111.             N++;
  112.         }
  113.         N = pow(2, N);
  114.         v.assign(2*N - 1, {0, N + 10, 0, -10, 0});
  115.         for (int i = N - 1; i < N - 1 + n; ++i){
  116.             int x; cin>>x;
  117.             int id = i - (N - 1);
  118.             if (x == 0){
  119.                 nd k = {1, id, 1, id, 1};
  120.                 v[i] = k;
  121.             }
  122.         }
  123.  
  124.         if (sh){
  125.             cout<<"go\n";
  126.         }
  127.  
  128.         for (int i = N - 2; i >= 0; --i){
  129.             mk(i);
  130.            
  131.         }
  132.  
  133.         if (sh){
  134.             cout<<"v\n";
  135.             for (int i = 0; i < 2*N - 1; ++i){
  136.                 cout<<"id = "<<i<<"\n";
  137.                 see(v[i]);
  138.             }
  139.         }
  140.     }
  141.  
  142.  
  143.     void upd(int id, int x){
  144.         id--;
  145.         id += N - 1;
  146.         if (x == 0 && v[id].mxl == 0){
  147.             v[id] = {0, id - (N - 1), 1 , id - (N - 1), 1};
  148.         }
  149.         while (id != 0){
  150.             id /= 2;
  151.            
  152.         }
  153.     }
  154.  
  155.  
  156. };
  157.  
  158.  
  159. int main()
  160. {
  161.     /*ios::sync_with_stdio(0);
  162.     cin.tie(0);
  163.     cout.tie(0);*/
  164.     int m;
  165.     tree T;
  166.     T.bld();
  167.     if (!sh) cin>>m;
  168.     for (int i = 0; i < m; ++i){
  169.         //запрос
  170.     }
  171. }
  172.  
  173. /*
  174.  
  175. 7
  176. 1 0 0 0 0 1 0
  177. */
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement