Advertisement
IanisBelu

COCI 2021 - Index

Jan 13th, 2024
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | Source Code | 0 0
  1. #ifdef LOCAL
  2. #include <iostream>
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <random>
  6. #include <vector>
  7. #include <queue>
  8. #include <stack>
  9. #include <set>
  10. #include <map>
  11. #else
  12. #include <bits/stdc++.h>
  13. #define cerr if (false) cerr
  14. #define endl '\n'
  15. #endif
  16.  
  17. #define fi first
  18. #define se second
  19.  
  20. #define sz(a) ((int)(a).size())
  21. #define all(a) (a).begin(), (a).end()
  22.  
  23. #define lsb(x) (x & (-x))
  24.  
  25. #define bit(mask, i) (((mask) >> (i)) & 1)
  26. #define popcount(x) __builtin_popcount(x)
  27.  
  28. #define YES cout << "YES" << endl
  29. #define NO cout << "NO" << endl
  30.  
  31. using namespace std;
  32.  
  33. template <typename T>
  34. bool ckmax(T &a, T b) { return a < b ? a = b, true : false; }
  35. template <typename T>
  36. bool ckmin(T &a, T b) { return a > b ? a = b, true : false; }
  37.  
  38. using ll = long long;
  39. using pii = pair<int, int>;
  40.  
  41. const int NMAX = 2e5+5;
  42. const int NIL  = -1;
  43.  
  44. struct PerSegTree {
  45.    struct Node {
  46.       int cnt, lchild, rchild;
  47.    };
  48.  
  49.    int n;
  50.    vector<Node> v;
  51.    vector<int> root;
  52.  
  53.    PerSegTree(int _n): n(_n), root({ build(1, n) }) { }
  54.  
  55.    int build(int l, int r) {
  56.       if (l >= r) {
  57.          Node node = { 0, NIL, NIL };
  58.          v.push_back(node);
  59.          return sz(v) - 1;
  60.       }
  61.  
  62.       int mid = (l + r) >> 1;
  63.  
  64.       Node node = { 0, build(l, mid), build(mid + 1, r) };
  65.      
  66.       v.push_back(node);
  67.       return sz(v) - 1;
  68.    }
  69.  
  70.    void update_val(int k, int pos, int val) {
  71.       root[k] = update_val(root[k], 1, n, pos, val);
  72.    }
  73.  
  74.    int update_val(int u, int l, int r, int pos, int val) {
  75.       if (pos < l || r < pos) return u;
  76.  
  77.       if (l >= r) {
  78.          Node node = { val, NIL, NIL };
  79.          v.push_back(node);
  80.          return sz(v) - 1;
  81.       }
  82.      
  83.       int mid = (l + r) >> 1;
  84.      
  85.       Node node = { 0,
  86.          update_val(v[u].lchild, l, mid, pos, val),
  87.          update_val(v[u].rchild, mid + 1, r, pos, val)
  88.       };
  89.  
  90.       node.cnt = v[node.lchild].cnt + v[node.rchild].cnt;
  91.      
  92.       v.push_back(node);
  93.       return sz(v) - 1;
  94.    }
  95.  
  96.    int query_cnt_greater(int k, int l, int r) {
  97.       return r - l + 1 - query_cnt(root[k - 1], 1, n, l, r);
  98.    }
  99.  
  100.    int query_cnt(int u, int l, int r, int ll, int rr) {
  101.       if (ll <= l && r <= rr)
  102.          return v[u].cnt;
  103.  
  104.       int mid = (l + r) >> 1;
  105.       int cnt = 0;
  106.  
  107.       if (ll <= mid) cnt = query_cnt(v[u].lchild, l, mid, ll, rr);
  108.       if (mid < rr) cnt += query_cnt(v[u].rchild, mid + 1, r, ll, rr);
  109.  
  110.       return cnt;
  111.    }
  112.  
  113.    void update_copy(int k) {
  114.       v.push_back(v[root[k]]);
  115.       root.push_back(sz(v) - 1);
  116.    }
  117. };
  118.  
  119. int n, m, max_val;
  120. vector<int> a[NMAX];
  121.  
  122. void read() {
  123.    cin >> n >> m;
  124.    for (int i = 1, x; i <= n; i++) {
  125.       cin >> x;
  126.       max_val = max(max_val, x);
  127.       a[x].push_back(i);
  128.    }
  129. }
  130.  
  131. int query(PerSegTree &tree, int ll, int rr) {
  132.    int l = 1, r = max_val;
  133.  
  134.    while (l <= r) {
  135.       int mid = (l + r) >> 1;
  136.       if (tree.query_cnt_greater(mid, ll, rr) >= mid) l = mid + 1;
  137.       else r = mid - 1;
  138.    }
  139.    
  140.    return r;
  141. }
  142.  
  143. void solve() {
  144.    PerSegTree tree(n);
  145.  
  146.  
  147.    for (int val = 1; val <= max_val; val++) {
  148.       tree.update_copy(val - 1);
  149.       for (auto &pos : a[val])
  150.          tree.update_val(val, pos, 1);
  151.    }
  152.  
  153.    while (m--) {
  154.       int l, r;
  155.       cin >> l >> r;
  156.       cout << query(tree, l, r) << endl;
  157.    }
  158. }
  159.  
  160. signed main() {
  161. #ifdef LOCAL
  162.    freopen("input.txt", "r", stdin);
  163. #endif
  164.    ios_base::sync_with_stdio(false);
  165.    cin.tie(0);
  166.    cout.tie(0);
  167.    
  168.    read();
  169.    solve();
  170.  
  171.    return 0;
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement