莫队+平板电视 TLE50pts 悬关求调
查看原帖
莫队+平板电视 TLE50pts 悬关求调
994729
Epitome楼主2024/10/19 23:50
#include <iostream>

#include <bits/extc++.h>

using namespace std;

using namespace __gnu_cxx;

using namespace __gnu_pbds;

const int N = 2e5 + 5, B = 600;

struct Zhangjc {
  int l, r, k, id;
} q[N];

int n, m, a[N], ans[N];

tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> t;

bool cmp( Zhangjc &i, Zhangjc &j ) {
  int pos1 = i.l / B, pos2 = j.l / B;
  return pos1 < pos2 || pos1 == pos2 && i.r < j.r;
}

int main() {
  ios :: sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  for ( int i = 1; i <= n; cin >> a[i++] ) {
  }
  for ( int i = 1; i <= m; ++i ) {
    cin >> q[i].l >> q[i].r >> q[i].k;
    q[i].id = i;
  }
  sort ( q + 1, q + m + 1, cmp );
  int l = 1, r = 0;
  for ( int i = 1; i <= m; ++i ) {
    while (r < q[i].r) t.insert(a[++r]);
    while (l > q[i].l) t.insert(a[--l]);
    while (l < q[i].l) t.erase(t.upper_bound(a[l++]));
    while (r > q[i].r) t.erase(t.upper_bound(a[r--]));
    ans[q[i].id] = *t.find_by_order(q[i].k - 1);
  }
  for ( int i = 1; i <= m; ++i ) {
    cout << ans[i] << '\n';
  }
  return 0;
}
2024/10/19 23:50
加载中...