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)