参考文章来源
参考代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int n,m,li,ri,ki,length,nid;
int a[MAXN],b[MAXN];
int Root[MAXN * 40],lson[MAXN * 40],rson[MAXN * 40],sum[MAXN * 40];
namespace ChairmanTree
{
void buildTree(int l,int r,int &cur)
{
cur = ++nid;
sum[cur] = 0;
if (l == r) return;
int mid = (l + r) >> 1;
buildTree(l,mid,lson[cur]);
buildTree(mid + 1,r,rson[cur]);
}
inline void update(int l,int r,int &cur,int pre,int pos)
{
cur = ++nid;
lson[cur] = lson[pre];
rson[cur] = rson[pre];
sum[cur] = sum[pre] + 1;
if (l == r) return;
int mid = (l + r) >> 1;
if (pos <= mid) update(l,mid,lson[cur],lson[pre],pos);
else update(mid + 1,r,rson[cur],rson[pre],pos);
}
inline int query(int L,int R,int l,int r,int k)
{
if (l == r) return l;
int mid = (l + r) >> 1;
int lcnt = sum[lson[R]] - sum[lson[L]];
if (k <= lcnt) return query(lson[L],lson[R],l,mid,k);
else return query(rson[L],rson[R],mid + 1,r,k - lcnt);
}
}
void init()
{
freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;++i)
{
qread(a[i]);
b[i] = a[i];
}
sort(b + 1,b + n + 1);
length = unique(b + 1,b + n + 1) - (b + 1);
ChairmanTree::buildTree(1,length,Root[0]);
for (int i = 1;i <= n;++i)
{
a[i] = lower_bound(b + 1,b + length + 1,a[i]) - b;
}
for (int i = 1;i <= n;++i)
{
ChairmanTree::update(1,length,Root[i],Root[i - 1],a[i]);
}
}
void work()
{
for (int i = 1;i <= m;++i)
{
qread(li);
qread(ri);
qread(ki);
int ans = ChairmanTree::query(Root[li - 1],Root[ri],1,length,ki);
printf("%d\n",b[ans]);
}
}
int main()
{
init();
work();
return 0;
}