Advertisement
tien_noob

Persistent IT - Sign on fence codeforces

Apr 6th, 2022
1,069
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.15 KB | None | 0 0
  1. //Make CSP great again
  2. //Vengeance
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. #define Log2(x) 31 - __builtin_clz(x)
  6. using namespace std;
  7. const int N = 1e5;
  8. int ver[N + 1];
  9. struct PersistentIT
  10. {
  11.     struct node
  12.     {
  13.         int l, r, best, pre, suf;
  14.         bool full;
  15.         node()
  16.         {
  17.             l = r = 0;
  18.             best = pre = suf = 1;
  19.             full = true;
  20.         }
  21.         node operator + (node other)
  22.         {
  23.             node tmp;
  24.             tmp.best = max({best, other.best, suf + other.pre});
  25.             tmp.full = full && other.full;
  26.             tmp.pre = pre;
  27.             tmp.suf = other.suf;
  28.             if (full)
  29.             {
  30.                 tmp.pre += other.pre;
  31.             }
  32.             if (other.full)
  33.             {
  34.                 tmp.suf += suf;
  35.             }
  36.             return tmp;
  37.         }
  38.     };
  39.     vector<node> tree;
  40.     PersistentIT()
  41.     {
  42.         node tmp;
  43.         tmp.full = false;
  44.         tmp.best = tmp.pre = tmp.suf = 0;
  45.         tree.resize(1, tmp);
  46.         ver[0] = 0;
  47.     }
  48.     void refine(int cur)
  49.     {
  50.         int l = tree[cur].l, r = tree[cur].r;
  51.         tree[cur] = tree[tree[cur].l] + tree[tree[cur].r];
  52.         tree[cur].l = l;
  53.         tree[cur].r = r;
  54.     }
  55.     int BuildTree(int L, int R)
  56.     {
  57.         int cur = tree.size();
  58.         node tmp;
  59.         tmp.best = tmp.suf = tmp.pre = tmp.full = 0;
  60.         tree.push_back(tmp);
  61.         if (L != R)
  62.         {
  63.             int mid = (L + R)/2;
  64.             tree[cur].l = BuildTree(L, mid);
  65.             tree[cur].r = BuildTree(mid + 1, R);
  66.         }
  67.         return cur;
  68.     }
  69.     int update(int oldID, int TreeL, int TreeR, int pos)
  70.     {
  71.         int cur = tree.size();
  72.         node tmp;
  73.         tree.push_back(tmp);
  74.         if (TreeL == TreeR)
  75.         {
  76.             return cur;
  77.         }
  78.         int mid = (TreeL + TreeR)/2;
  79.         if (pos <= mid)
  80.         {
  81.             tree[cur].r = tree[oldID].r;
  82.             tree[cur].l = update(tree[oldID].l, TreeL, mid, pos);
  83.             refine(cur);
  84.         }
  85.         else
  86.         {
  87.             tree[cur].l = tree[oldID].l;
  88.             tree[cur].r = update(tree[oldID].r, mid + 1, TreeR, pos);
  89.             refine(cur);
  90.         }
  91.         return cur;
  92.     }
  93.     node get(int v, int TreeL, int TreeR, int l, int r)
  94.     {
  95.         //cerr << v << '\n';
  96.         if (l > r)
  97.         {
  98.             node tmp;
  99.             tmp.full = false;
  100.             tmp.best = tmp.pre = tmp.suf = 0;
  101.             return tmp;
  102.         }
  103.         if (TreeL == l && TreeR == r)
  104.         {
  105.             return tree[v];
  106.         }
  107.         int mid = (TreeL + TreeR)/2;
  108.         return get(tree[v].l, TreeL, mid, l, min(r, mid)) + get(tree[v].r, mid + 1, TreeR, max(l, mid + 1), r);
  109.     }
  110. } Tree;
  111. int id[N + 1], a[N + 1], n;
  112. void read()
  113. {
  114.     cin >> n;
  115.     for (int i = 1; i <= n; ++ i)
  116.     {
  117.         cin >> a[i];
  118.         id[i] = i;
  119.     }
  120.     sort(id + 1, id + n + 1, [](const int &x, const int &y)
  121.     {
  122.         return a[x] > a[y];
  123.     });
  124.     Tree.BuildTree(1, n);
  125.     for (int i = 1; i <= n; ++ i)
  126.     {
  127.         ver[i] = Tree.update(ver[i - 1], 1, n, id[i]);
  128.         //cerr << ver[i] << ' ';
  129.     }
  130. }
  131. void solve()
  132. {
  133.     int m;
  134.     cin >> m;
  135.     while(m--)
  136.     {
  137.         int l, r, w;
  138.         cin >> l >> r >> w;
  139.         int low = 1, high = n;
  140.         int k;
  141.         while(low <= high)
  142.         {
  143.             int mid = (low + high)/2;
  144.             if (Tree.get(ver[mid], 1, n, l, r).best >= w)
  145.             {
  146.                 k = mid;
  147.                 high = mid - 1;
  148.             }
  149.             else
  150.             {
  151.                 low = mid + 1;
  152.             }
  153.         }
  154.         //cerr << low << '\n';
  155.         cout << a[id[low]] << '\n';
  156.     }
  157. }
  158. int main()
  159. {
  160.     ios_base::sync_with_stdio(false);
  161.     cin.tie(nullptr);
  162.     if (fopen(TASK".INP", "r"))
  163.     {
  164.         freopen(TASK".INP", "r", stdin);
  165.         //freopen(TASK".OUT", "w", stdout);
  166.     }
  167.     int t = 1;
  168.     bool typetest = false;
  169.     if (typetest)
  170.     {
  171.         cin >> t;
  172.     }
  173.     for (int __ = 1; __ <= t; ++ __)
  174.     {
  175.         //cout << "Case " << __ << ": ";
  176.         read();
  177.         solve();
  178.     }
  179. }
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement