Homework Introduction
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct node {
int val, l, r;
} tree[N * 4 + N * 30];
int n, m, a[N], b[N], Id[N], root[N], id, cnt;
void pushup(int rt) {
tree[rt].val = tree[tree[rt].l].val + tree[tree[rt].r].val;
}
void build(int l, int r, int rt) {
if (l == r) {
return;
int mid = (l + r) >> 1;
if (p <= mid) {
tree[rt].r = tree[last].r;
tree[rt].l = ++id;
update(l, mid, tree[rt].l, tree[last].l, p);
} else {
tree[rt].l = tree[last].l;
tree[rt].r = ++id;
update(mid + 1, r, tree[rt].r, tree[last].r, p);
}
pushup(rt);
}
int query(int l, int r, int L, int R, int k) {
if (l == r)
return l;
int mid = (l + r) >> 1;
int D = tree[tree[R].l].val - tree[tree[L].l].val;
if (D < k) {
return query(mid + 1, r, tree[L].r, tree[R].r, k - D);
} else
return query(l, mid, tree[L].l, tree[R].l, k);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
cnt = unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= n; i++) {
Id[i] = lower_bound(b + 1, b + cnt + 1, a[i]) - b;
}
root[0] = ++id;
build(1, cnt, root[0]);
for (int i = 1; i <= n; i++) {
root[i] = ++id;
update(1, cnt, root[i], root[i - 1], Id[i]);
}
for (int i = 1; i <= m; i++) {
int l, r, x;
cin >> l >> r >> x;
cout << b[query(1, cnt, root[l - 1], root[r], x)] << endl;
}
return 0;
}
Problem
Please claim the assignment to see the problems.
- Status
- Live...
- Problem
- 6
- Open Since
- 2025-9-16 0:00
- Deadline
- 2026-1-1 23:59
- Extension
- 24 hour(s)