| Time Limit: 20000MS | Memory Limit: 65536K | |
| Total Submissions: 35704 | Accepted: 11396 | |
| Case Time Limit: 2000MS | ||
Description
Input
Output
Sample Input
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
Sample Output
5 6 3
Hint
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN=100000+100;
const int MAXM=MAXN*20;
int tot,n,m;
int da[MAXN],sDa[MAXN];
int leftChild[MAXM],rightChild[MAXM],wei[MAXM],chairTNode[MAXM];
/**********************************
*参数:待处理元素区间
*功能:建立一棵空线段树
*返回值:返回根节点下标
***********************************/
int Build(int left,int right)
{
int id=tot++;
wei[id]=0;
if(left<right)
{
int mid=(left+right)>>1;
leftChild[id]=Build(left,mid);
rightChild[id]=Build(mid+1,right);
}
return id;
}
int Update(int root,int pos,int val)
{
int l=1,r=m,mid,newRoot=tot++,retRoot=newRoot;
wei[newRoot]=wei[root]+val;
while(l<r)
{
mid=(l+r)>>1;
if(pos<=mid)
{
//确定节点孩子节点
leftChild[newRoot]=tot++;
rightChild[newRoot]=rightChild[root];
//确定待跟新节点以及历史版本
newRoot=leftChild[newRoot];
root=leftChild[root];
r=mid;
}
else
{
rightChild[newRoot]=tot++;
leftChild[newRoot]=leftChild[root];
newRoot=rightChild[newRoot];
root=rightChild[root];
l=mid+1;
}
wei[newRoot]=wei[root]+val;
}
return retRoot;
}
int Query(int leftRoot,int rightRoot,int k)
{
int l=1,r=m,mid;
while(l<r)
{
mid=(l+r)>>1;
if(wei[leftChild[leftRoot]]-wei[leftChild[rightRoot]]>=k)//第k小值在左子树
{
//确定查找新区间
leftRoot=leftChild[leftRoot];
rightRoot=leftChild[rightRoot];
r=mid;
}
else
{
k-=wei[leftChild[leftRoot]]-wei[leftChild[rightRoot]];
leftRoot=rightChild[leftRoot];
rightRoot=rightChild[rightRoot];
l=mid+1;
}
}
return l;
}
int main()
{
int q,i;
int ql,qr,k;
while(scanf("%d%d",&n,&q)!=EOF)
{
m=0;
tot=0;
for(i=1;i<=n;i++)
{
scanf("%d",&da[i]);
sDa[i]=da[i];
}
sort(sDa+1,sDa+n+1);
m=unique(sDa+1,sDa+1+n)-sDa-1;
chairTNode[n+1]=Build(1,m);
//cout<<"**********"<<endl;
for(i=n;i>=1;i--)
{
int pos=lower_bound(sDa+1,sDa+1+m,da[i])-sDa;
chairTNode[i]=Update(chairTNode[i+1],pos,1);
}
while(q--)
{
scanf("%d%d%d",&ql,&qr,&k);
printf("%d\n",sDa[Query(chairTNode[ql],chairTNode[qr+1],k)]);
}
}
system("pause");
return 0;
}
原文地址:http://blog.csdn.net/xiaofengcanyuexj/article/details/25653311