Advertisement
tien_noob

Binary Search on Segment Tree - Walk on tree

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