Advertisement
Korotkodul

ДО 3

Aug 13th, 2022 (edited)
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.20 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 = 0;
  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. int L, R;
  65. nd no;//значит нет узла
  66.  
  67. struct tree{
  68.     vector <nd> v;
  69.  
  70.     void show(){
  71.         cout<<"v\n";
  72.         for (int i = 0; i < 2 * N - 1; ++i){
  73.             cout<<"id = "<<i<<"\n";
  74.             see(v[i]);
  75.         }
  76.     }
  77.  
  78.     void mk(int i){//сделать узел на основе двух сыновей - make
  79.         int un = -1;
  80.         v[i].Li = min(v[i*2 + 1].Li, v[i*2 + 2].Li);
  81.         v[i].Ll = v[2 * i + 1].Ll;
  82.         if (v[i].Ll == 0){
  83.             v[i].Ll = v[2 * i + 2].Ll;
  84.         }
  85.         v[i].Ri = max(v[i*2 + 1].Ri, v[i*2 + 2].Ri);
  86.         v[i].Rl = v[2 * i + 2].Rl;
  87.         if (v[i].Rl == 0){
  88.             v[i].Rl = v[2 * i + 1].Rl;
  89.         }
  90.         v[i].mxl = max(v[i * 2 + 1].mxl, v[i * 2 + 2].mxl);
  91.  
  92.         if (v[i * 2 + 1].Ri + 1 == v[i * 2 + 2].Li){
  93.             un = v[i * 2 + 1].Rl + v[i * 2 + 2].Ll;
  94.             //v[i].mxl = max(un, v[i].mxl);
  95.             if (un > v[i].mxl){
  96.  
  97.                 v[i].mxl = un;
  98.                 /*if (sh){
  99.                     cout<<"un\n";
  100.                     cout<<"id = "<<i<<"\n";
  101.                     see(v[i * 2 + 1]);
  102.                     see(v[i * 2 + 2]);
  103.                 }*/
  104.             }
  105.  
  106.             //учесть - если объединили с краев
  107.             if ( v[2*i + 1].Li + v[2 * i + 1].Ll - 1 == v[2 * i + 1].Ri){//слева только одна п-ть 0й
  108.                  v[i].Ll =  v[2 * i + 1].Rl + v[2 * i + 2].Ll;
  109.             }
  110.             if ( v[2*i + 2].Li + v[2 * i + 2].Ll - 1 == v[2 * i + 2].Ri){//слева только одна п-ть 0й
  111.                  v[i].Rl =  v[2 * i + 1].Rl + v[2 * i + 2].Ll;
  112.             }
  113.  
  114.         }
  115.     }
  116.  
  117.     void bld(){
  118.         cin>>n;
  119.         N = log2(n);
  120.         if (pow(2, N) < n){
  121.             N++;
  122.         }
  123.         N = pow(2, N);
  124.  
  125.         no = {0, N + 10, 0, -10, 0};
  126.  
  127.         v.assign(2*N - 1, no);
  128.         for (int i = N - 1; i < N - 1 + n; ++i){
  129.             int x; cin>>x;
  130.             int id = i - (N - 1);
  131.             if (x == 0){
  132.                 nd k = {1, id, 1, id, 1};
  133.                 v[i] = k;
  134.             }
  135.         }
  136.  
  137.         if (sh){
  138.             cout<<"go\n";
  139.         }
  140.  
  141.         for (int i = N - 2; i >= 0; --i){
  142.             mk(i);
  143.         }
  144.  
  145.         if (sh){
  146.             cout<<"BDL\n";
  147.             show();
  148.         }
  149.     }
  150.  
  151.  
  152.     void upd(int id, int x){
  153.         id--;
  154.         id += N - 1;
  155.         if (x == 0){
  156.             v[id] = {1, id - (N - 1), 1 , id - (N - 1), 1};
  157.         }
  158.         else if (x != 0 ){
  159.             v[id] = no;
  160.         }
  161.         while (id > 0){
  162.             id--;
  163.             id /= 2;
  164.             mk(id);
  165.         }
  166.  
  167.         if (sh){
  168.             show();
  169.         }
  170.  
  171.     }
  172.  
  173.     nd get(int id, int l, int r){
  174.         if (l >= L && r <=  R){
  175.             return v[id];
  176.         }
  177.         else if (max(l, L) <= min(r, R)){
  178.             nd res;
  179.             int m = (l + r) / 2;
  180.             nd Lft,Rgt;
  181.             Lft = get(2 * id + 1, l, m);
  182.             Rgt = get(2 * id + 2, m + 1, r);
  183.  
  184.             //для всех
  185.             int un = -1;
  186.             res.Li = min(Lft.Li, Rgt.Li);
  187.             res.Ll = Lft.Ll;
  188.             if (res.Ll == 0){
  189.                 res.Ll = Rgt.Ll;
  190.             }
  191.             res.Ri = max(Lft.Ri, Rgt.Ri);
  192.             res.Rl = Rgt.Rl;
  193.             if (res.Rl == 0){
  194.                 res.Rl = Lft.Rl;
  195.             }
  196.             res.mxl = max(Lft.mxl, Rgt.mxl);
  197.  
  198.             //если можно объединить
  199.             if (Lft.Ri + 1 == Rgt.Li){
  200.                 un = Lft.Rl + Rgt.Ll;
  201.                 //v[i].mxl = max(un, v[i].mxl);
  202.                 if (un > res.mxl){
  203.  
  204.                     res.mxl = un;
  205.                     /*if (sh){
  206.                         cout<<"un\n";
  207.                         cout<<"id = "<<i<<"\n";
  208.                         see(v[i * 2 + 1]);
  209.                         see(v[i * 2 + 2]);
  210.                     }*/
  211.                 }
  212.  
  213.                 //учесть - если объединили с краев
  214.                 if ( Lft.Li + Lft.Ll - 1 == Lft.Ri){//слева только одна п-ть 0й
  215.                      res.Ll =  Lft.Rl + Rgt.Ll;
  216.                 }
  217.                 if ( Rgt.Li + Rgt.Ll - 1 == Rgt.Ri){//слева только одна п-ть 0й
  218.                      res.Rl =  Lft.Rl + Rgt.Ll;
  219.                 }
  220.  
  221.             }
  222.  
  223.             return res;
  224.  
  225.         }
  226.         else{
  227.             return no;
  228.         }
  229.     }
  230.  
  231.  
  232. };
  233.  
  234. /*
  235. ОСТАЛОСЬ:
  236. debug на сэмпле - ошибки
  237. */
  238.  
  239. int main()
  240. {
  241.     ios::sync_with_stdio(0);
  242.     cin.tie(0);
  243.     cout.tie(0);
  244.     int m;
  245.     tree T;
  246.     T.bld();
  247.     //if (!sh)
  248.     cin>>m;
  249.     for (int i = 0; i < m; ++i){
  250.         //запрос
  251.         string q; cin>>q;
  252.         if (q[0] == 'Q'){
  253.             if (sh) cout<<"ASK\n";
  254.             cin>>L>>R; L--; R--;
  255.             nd ans = T.get(0, 0, N - 1);
  256.             cout<<ans.mxl<<"\n";
  257.         }
  258.         else{
  259.             if (sh) cout<<"UPD\n";
  260.             int id, x; cin>>id>>x; T.upd(id, x);
  261.  
  262.         }
  263.     }
  264. }
  265.  
  266. /*
  267. Примеры
  268. Входные данные
  269. 5
  270. 328 0 0 0 0
  271. 5
  272. QUERY 1 3
  273. UPDATE 2 832
  274. QUERY 3 3
  275. QUERY 2 3
  276. UPDATE 2 0
  277. Выходные данные
  278. 2
  279. 1
  280. 1
  281. */
  282.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement