Advertisement
tien_noob

Add - Erase - GetMax from L -> R

Jan 17th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. //Make CSP great again
  2. //You're as beautiful as the day I lost you
  3. //New year, best wishes
  4. #include <bits/stdc++.h>
  5. #define TASK "TESTCODE"
  6. #define Log2(x) 31 - __builtin_clz(x)
  7. using namespace std;
  8. const int N = 1e6, M = 2e5;
  9. int n, m;
  10. string s[M + 1];
  11. struct SegmentTree
  12. {
  13.     bitset<N + 1> used;
  14.     vector<int> Tree[4 * N + 1], up[4 * N + 1];
  15.     void Update(int v, int TreeL, int TreeR, int L, int R, int val)
  16.     {
  17.         if (L > R)
  18.         {
  19.             return ;
  20.         }
  21.         while(!up[v].empty() && used[up[v].back()])
  22.         {
  23.             up[v].pop_back();
  24.         }
  25.         up[v].push_back(val);
  26.         if (TreeL == L && TreeR == R)
  27.         {
  28.             while(!Tree[v].empty() && used[Tree[v].back()])
  29.             {
  30.                 Tree[v].pop_back();
  31.             }
  32.             Tree[v].push_back(val);
  33.             return ;
  34.         }
  35.         int mid = (TreeL + TreeR)/2;
  36.         Update(v * 2, TreeL, mid, L, min(mid, R), val);
  37.         Update(v * 2 + 1, mid + 1, TreeR, max(L, mid + 1), R, val);
  38.     }
  39.     int Get(int v, int TreeL, int TreeR, int L, int R)
  40.     {
  41.         if (L > R)
  42.         {
  43.             return -1;
  44.         }
  45.         int ret = -1;
  46.         while(!Tree[v].empty() && used[Tree[v].back()])
  47.         {
  48.             Tree[v].pop_back();
  49.         }
  50.         if (!Tree[v].empty())
  51.         {
  52.             ret = max(ret, Tree[v].back());
  53.         }
  54.         if (TreeL == L && TreeR == R)
  55.         {
  56.             while(!up[v].empty() && used[up[v].back()])
  57.             {
  58.                 up[v].pop_back();
  59.             }
  60.             if (!up[v].empty())
  61.             {
  62.                 ret = max(ret, up[v].back());
  63.             }
  64.             return ret;
  65.         }
  66.         int mid = (TreeL + TreeR)/2;
  67.         ret = max({ret, Get(v * 2, TreeL, mid, L, min(R, mid)), Get(v * 2 + 1, mid + 1, TreeR, max(L, mid + 1), R)});
  68.         return ret;
  69.     }
  70.     void add(int L, int R, int val)
  71.     {
  72.         Update(1, 1, n, L, R, val);
  73.     }
  74.     int Query(int L, int R)
  75.     {
  76.         int t = Get(1, 1, n, L, R);
  77.         if (t != -1)
  78.         {
  79.             used[t] = true;
  80.         }
  81.         return t;
  82.     }
  83. } Tree;
  84. void read()
  85. {
  86.     cin >> n >> m;
  87. }
  88. void solve()
  89. {
  90.     for (int i = 1; i <= m; ++ i)
  91.     {
  92.         int t;
  93.         cin >> t;
  94.         if (t == 1)
  95.         {
  96.             cin >> s[i];
  97.             int l, r;
  98.             cin >> l >> r;
  99.             ++l;
  100.             ++r;
  101.             Tree.add(l, r, i);
  102.         }
  103.         else
  104.         {
  105.             int l, r;
  106.             cin >> l >> r;
  107.             ++l;
  108.             ++r;
  109.             int ret = Tree.Query(l, r);
  110.             if (ret != -1)
  111.             {
  112.                 cout << s[ret] << '\n';
  113.             }
  114.             else
  115.             {
  116.                 cout << -1 << '\n';
  117.             }
  118.         }
  119.     }
  120. }
  121. int main()
  122. {
  123.     ios_base::sync_with_stdio(false);
  124.     cin.tie(nullptr);
  125.     if (fopen(TASK".INP", "r"))
  126.     {
  127.         freopen(TASK".INP", "r", stdin);
  128.         //freopen(TASK".out", "w", stdout);
  129.     }
  130.     int t = 1;
  131.     bool typetest = false;
  132.     if (typetest)
  133.     {
  134.         cin >> t;
  135.     }
  136.     for (int __ = 1; __ <= t; ++ __)
  137.     {
  138.         //cout << "Case " << __ << ": ";
  139.         read();
  140.         solve();
  141.     }
  142. }
  143.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement