lajflsjfj

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100003
#define M 400003
using namespace std;
int a[N],b[N],p[N],root[N],n,m,sz;
struct data
{
  int l,r,w;
};data tree[M*20];
int cmp(int x,int y)
{
  return a[x]<a[y];
}
void insert(int &i,int l,int r,int x)
{
    tree[++sz]=tree[i]; i=sz;
    tree[i].w++;
    if (l==r) return;
    int mid=(l+r)>>1;
    if (x<=mid) insert(tree[i].l,l,mid,x);
    else insert(tree[i].r,mid+1,r,x);
}
int query(int i,int j,int l,int r,int k)
{
    if (l==r) return l;
    int t=tree[tree[j].l].w-tree[tree[i].l].w;
    int mid=(l+r)>>1;
    if (t>=k) return query(tree[i].l,tree[j].l,l,mid,k);
    else return query(tree[i].r,tree[j].r,mid+1,r,k-t);
}
int main()
{
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++)
   {
   scanf("%d",&a[i]);
   p[i]=i;
   }
  sort(p+1,p+n+1,cmp);
  for (int i=1;i<=n;i++)
   b[p[i]]=i;//离散化,p[i]表示第i小的值在a[]中的下标 
  sz=0; root[0]=0;
  for (int i=1;i<=n;i++)
   {
   	 root[i]=root[i-1];
   	 insert(root[i],1,n,b[i]);
   }
  for (int i=1;i<=m;i++)
   {
   	 int x,y,z;
     scanf("%d%d%d",&x,&y,&z);
     int t=query(root[x-1],root[y],1,n,z);
     printf("%d\n",a[p[t]]);
   }
}

你可能感兴趣的:(lajflsjfj)