#include <bits/stdc++.h>
using namespace std;
inline long long read() {
char ch = getchar();
long long f = 1,x = 0;
while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + ch - '0'; ch = getchar(); }
return x * f;
}
//void ReadFile() {
// FILE* stream1;
// freopen_s(&stream1,"in.txt", "r", stdin);
// freopen_s(&stream1,"out.txt", "w", stdout);
//}
static auto speedup = []() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); return nullptr; }();
const int maxn = 2e5 + 7;
int n, m, a[maxn],root[maxn],cnt = 0;
struct Node{
int l, r, sum;
}t[maxn << 5];
vector<int> v;
inline int getId(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; }
void insert(int l, int r, int pre, int& now, int x) {
t[++cnt] = t[pre];
now = cnt;
t[now].sum++;
if (l == r)return;
int mid = (l + r) >> 1;
if (x <= mid)insert(l, mid, t[pre].l, t[now].l, x);
else insert(mid + 1, r, t[pre].r, t[now].r, x);
}
int query(int l, int r, int L, int R, int k) {
if (l == r) return l;
int mid = (l + r) >> 1;
int c = t[t[R].l].sum - t[t[L].l].sum;
if (k <= c) return query(l, mid, t[L].l, t[R].l,k);
return query(mid + 1, r, t[L].r, t[R].r, k - c);
}
void slove() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
v.push_back(a[i]);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
int s = v.size();
for (int i = 1; i <= n; i++) {
insert(1, s, root[i - 1], root[i], getId(a[i]));
}
while (m--) {
int l, r, k;
cin >> l >> r >> k;
cout << v[query(1, s, root[l - 1], root[r], k) - 1] << endl;
}
}
int main() {
slove();
return 0;
}
P3834 【模板】可持久化线段树 2
最新推荐文章于 2024-10-07 09:58:35 发布