danielvitor23

MKTHNUM

May 19th, 2023
1,281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, m;
  5. vector<int> a;
  6.  
  7. struct Vertex {
  8.   Vertex *l, *r;
  9.   int sum;
  10.  
  11.   Vertex(int val): l(nullptr), r(nullptr), sum(val) {}
  12.   Vertex(Vertex *l, Vertex *r) : l(l), r(r), sum(0) {
  13.     if (l) sum += l->sum;
  14.     if (r) sum += r->sum;
  15.   }
  16. };
  17.  
  18. Vertex* build(int l, int r) {
  19.   if (l == r)
  20.     return new Vertex(0);
  21.   int m = l + (r - l) / 2;
  22.   return new Vertex(
  23.     build(l, m),
  24.     build(m+1, r)
  25.   );
  26. }
  27.  
  28. int get_sum(Vertex* v, int l, int r, int ql, int qr) {
  29.   if (l > r) return 0;
  30.   if (l == ql and qr == r) return v->sum;
  31.   int m = l + (r - l) / 2;
  32.   return get_sum(v->l, l, m, ql, min(qr, m)) +
  33.     get_sum(v->r, m+1, r, max(ql, m+1), qr);
  34. }
  35.  
  36. Vertex* update(Vertex* v, int l, int r, int pos) {
  37.   if (l == r) return new Vertex(v->sum + 1);
  38.   int m = l + (r - l) / 2;
  39.   if (pos <= m) return new Vertex(update(v->l, l, m, pos), v->r);
  40.   else return new Vertex(v->l, update(v->r, m+1, r, pos));
  41. }
  42.  
  43. int find_kth(Vertex* vl, Vertex* vr, int l, int r, int k) {
  44.   if (l == r) return l;
  45.   int m = l + (r - l) / 2;
  46.   int cntLeft = vr->l->sum - vl->l->sum;
  47.   if (cntLeft >= k)
  48.     return find_kth(vl->l, vr->l, l, m, k);
  49.   return find_kth(vl->r, vr->r, m+1, r, k-cntLeft);
  50. }
  51.  
  52. int main() {
  53.   cin.tie(0)->sync_with_stdio(0);
  54.  
  55.   cin >> n >> m;
  56.   a.assign(n+1, 0);
  57.  
  58.   vector<int> C;
  59.   for (int i = 1; i <= n; ++i) {
  60.     cin >> a[i];
  61.     C.push_back(a[i]);
  62.   }
  63.  
  64.   sort(C.begin(), C.end());
  65.   C.erase(unique(C.begin(), C.end()), C.end());
  66.  
  67.   map<int, int> mp;
  68.   for (int i = 1; i <= n; ++i) {
  69.     int x = (lower_bound(C.begin(), C.end(), a[i]) - C.begin()) + 1;
  70.     mp[x] = a[i];
  71.     a[i] = x;
  72.   }
  73.  
  74.   int L = 1, R = C.size() + 1;
  75.  
  76.   vector<Vertex*> roots;
  77.   roots.push_back(build(L, R));
  78.  
  79.   for (int i = 1; i <= n; ++i) {
  80.     roots.push_back(update(roots.back(), L, R, a[i]));
  81.   }
  82.  
  83.   while (m--) {
  84.     int i, j, k; cin >> i >> j >> k;
  85.  
  86.     int pos = find_kth(roots[i-1], roots[j], L, R, k);
  87.  
  88.     cout << mp[pos] << '\n';
  89.   }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment