1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1000100;
struct node {
node *ls, *rs;
int data;
} _pool[maxn * 20], *current;
void init() {
current = _pool;
}
node* allocNode() {
return current++;
}
node* build(int ln, int rn) {
node* now = allocNode();
now->data = 0;
now->ls = NULL;
now->rs = NULL;
if (ln < rn) {
int mid = (ln + rn) / 2;
now->ls = build(ln, mid);
now->rs = build(mid + 1, rn);
}
return now;
}
node* insert(node* root, int ln, int rn, int val) {
node* now = allocNode();
*now = *root;
now->data++;
if (ln != rn) {
int mid = (ln + rn) / 2;
if (val <= mid) {
now->ls= insert(now->ls, ln, mid, val);
}
else {
now->rs= insert(now->rs, mid+1, rn, val);
}
}
return now;
}
int query(node* s, node* t, int ln, int rn, int k) {
//printf(">>> [%d, %d], (%d, %d), %d\n", s-_pool, t-_pool, ln, rn, k);
//printf("--- <%d, %d>, <%d, %d>\n", s->ls-_pool, s->rs-_pool, t->ls-_pool, t->rs-_pool);
if (ln == rn) return ln;
int delta = t->ls->data - s->ls->data;
int mid = (ln + rn) / 2;
if (delta >= k) {
return query(s->ls, t->ls, ln, mid, k);
}
else {
return query(s->rs, t->rs, mid+1, rn, k - delta);
}
}
void treeShow(node* root) {
if (root != NULL) {
printf("%d: <(%d, %d), %d>\n", root-_pool, root->ls-_pool, root->rs-_pool, root->data);
treeShow(root->ls);
treeShow(root->rs);
}
}
node* T[maxn];
int ori[maxn];
int dis[maxn];
int main() {
int n, q;
while (scanf("%d%d", &n, &q) != EOF) {
init();
for (int i = 1; i <= n; i++) {
scanf("%d", &ori[i]);
dis[i] = ori[i];
}
sort(dis + 1, dis + n + 1);
int m = unique(dis + 1, dis + 1 + n) - dis - 1;
T[0] = build(1, m);
for (int i = 1; i <= n; i++) {
int pos = lower_bound(dis + 1, dis + m + 1, ori[i]) - dis;
T[i] = insert(T[i-1], 1, m, pos);
}
//treeShow(T[2]);
for (int i = 0; i < q; i++) {
int s, t, k;
scanf("%d%d%d", &s, &t, &k);
printf("%d\n", dis[query(T[s-1], T[t], 1, m, k)]);
}
}
return 0;
}
|