tron24

Untitled

Apr 22nd, 2021 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define ll long long
  5. #define fi first
  6. #define se second
  7.  
  8. struct segtree
  9. {
  10.     ll size;
  11.     vector<pair<ll, ll>> val;
  12.     void init(ll n)
  13.     {
  14.         size = 1;
  15.         while (size < n)
  16.         {
  17.             size *= 2;
  18.         }
  19.         pair<ll, ll> p = {1e18, 0};
  20.         val.assign(2 * size, p);
  21.     }
  22.  
  23.     void build(vector<ll> &a, ll x, ll lx, ll rx)
  24.     {
  25.         if (rx - lx == 1)
  26.         {
  27.             if (lx < a.size())
  28.             {
  29.                 val[x] = {a[lx], 1};
  30.             }
  31.         }
  32.         else
  33.         {
  34.             ll m = (lx + rx) / 2;
  35.             build(a, 2 * x + 1, lx, m);
  36.             build(a, 2 * x + 2, m, rx);
  37.             auto pl = val[2 * x + 1], pr = val[2 * x + 2];
  38.             if (pl.fi < pr.fi)
  39.             {
  40.                 val[x] = pl;
  41.             }
  42.             else if (pl.fi > pr.fi)
  43.             {
  44.                 val[x] = pr;
  45.             }
  46.             else
  47.             {
  48.                 val[x] = {pl.fi, pr.se + pl.se};
  49.             }
  50.         }
  51.     }
  52.  
  53.     void build(vector<ll> &a)
  54.     {
  55.         build(a, 0, 0, size);
  56.     }
  57.  
  58.     void set(ll i, ll v, ll x, ll lx, ll rx)
  59.     {
  60.         if (rx - lx == 1)
  61.         {
  62.             val[x] = {v, 1};
  63.             return;
  64.         }
  65.         ll m = (lx + rx) / 2;
  66.         if (i < m)
  67.         {
  68.             set(i, v, 2 * x + 1, lx, m);
  69.         }
  70.         else
  71.         {
  72.             set(i, v, 2 * x + 2, m, rx);
  73.         }
  74.  
  75.         auto pl = val[2 * x + 1], pr = val[2 * x + 2];
  76.         if (pl.fi < pr.fi)
  77.         {
  78.             val[x] = pl;
  79.         }
  80.         else if (pl.fi > pr.fi)
  81.         {
  82.             val[x] = pr;
  83.         }
  84.         else
  85.         {
  86.             val[x] = {pl.fi, pr.se + pl.se};
  87.         }
  88.     }
  89.  
  90.     void set(ll i, ll v)
  91.     {
  92.         set(i, v, 0, 0, size);
  93.     }
  94.  
  95.     pair<ll, ll> calc(ll l, ll r, ll x, ll lx, ll rx)
  96.     {
  97.         if (lx >= r || rx <= l)
  98.         {
  99.             pair<ll, ll> p = {1e18, 1};
  100.             return p;
  101.         }
  102.  
  103.         if (l <= lx && rx <= r)
  104.         {
  105.             return val[x];
  106.         }
  107.  
  108.         ll m = (lx + rx) / 2;
  109.         auto pl = calc(l, r, 2 * x + 1, lx, m);
  110.         auto pr = calc(l, r, 2 * x + 2, m, rx);
  111.         if (pl.fi < pr.fi)
  112.         {
  113.             return pl;
  114.         }
  115.         else if (pl.fi > pr.fi)
  116.         {
  117.             return pr;
  118.         }
  119.         else
  120.         {
  121.             return {pl.fi, pr.se + pl.se};
  122.         }
  123.     }
  124.  
  125.     pair<ll, ll> calc(ll l, ll r)
  126.     {
  127.         return calc(l, r, 0, 0, size);
  128.     }
  129. };
  130.  
  131. int main()
  132. {
  133.     int n, m;
  134.     cin >> n >> m;
  135.     segtree st;
  136.     vector<ll> a(n);
  137.     st.init(n);
  138.     for (ll i = 0; i < n; i++)
  139.     {
  140.         cin >> a[i];
  141.         // st.set(i, a[i]);
  142.     }
  143.  
  144.     st.build(a);
  145.  
  146.     for (ll q = 0; q < m; q++)
  147.     {
  148.         ll op;
  149.         cin >> op;
  150.         if (op == 1)
  151.         {
  152.             ll i, v;
  153.             cin >> i >> v;
  154.             st.set(i, v);
  155.         }
  156.         else
  157.         {
  158.             ll l, r;
  159.             cin >> l >> r;
  160.             auto p = st.calc(l, r);
  161.             cout << p.fi << " " << p.se << "\n";
  162.         }
  163.     }
  164. }
Add Comment
Please, Sign In to add comment