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
| #include <bits/stdc++.h> using namespace std; #define mid ((l+r)>>1) #define rep(i, a, b) for(int i=(a); i<=(b); i++) #define ll long long #define maxn 1000020 int a[maxn], b[maxn], t[maxn], n, m, k; struct str { int l, r, val; }tree[maxn<<5]; int top; inline int read() { char ch=getchar(); int ans=0; while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') ans=(ans<<3)+(ans<<1)+(ch^48), ch=getchar(); return ans; } inline int build(int l, int r) { int node=++top; if(l!=r) { tree[node].l=build(l, mid); tree[node].r=build(mid+1, r); } return node; } inline int clone(int node) { tree[++top]=tree[node]; tree[top].val++; return top; } inline int update(int pre, int l, int r, int x) { int node=clone(pre); if(l!=r) { if(x<=mid) tree[node].l=update(tree[node].l, l, mid, x); else tree[node].r=update(tree[node].r, mid+1, r, x); } return node; } inline int query(int u, int v, int l, int r, int k) { if(l==r) return b[l]; else { int node=tree[tree[v].l].val-tree[tree[u].l].val; if(k<=node) return query(tree[u].l, tree[v].l, l, mid, k); else return query(tree[u].r, tree[v].r, mid+1, r, k-node); } } signed main() { scanf("%d%d", &n, &m); rep(i, 1, n) scanf("%d", &a[i]), b[i]=a[i]; sort(b+1, b+n+1); int size=unique(b+1, b+n+1)-(b+1); rep(i, 1, n) { int x=lower_bound(b+1, b+size+1, a[i])-b; t[i]=update(t[i-1], 1, size, x); } rep(i, 1, m) { int l=read(), r=read(), k=read(); printf("%d\n", query(t[l-1], t[r], 1, size, k)); } return 0; }
|