求助:过不了样例
查看原帖
求助:过不了样例
157598
Magallan_forever楼主2020/7/30 16:07
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100001;
int a[maxn],copy_[maxn],tot=1,newn;
int tree[maxn<<5],ls[maxn<<5],rs[maxn<<5],sum[maxn<<5];
int build(int l,int r){
	int p=++tot;
	sum[p]=0;
	if(l<r) ls[p]=build(l,l+r>>1),rs[p]=build((l+r>>1)+1,r);
	return p;
}
int upd(int pre,int l,int r,int x){
	int p=++tot;
	ls[p]=ls[pre],rs[p]=rs[pre],sum[p]=sum[pre];
	if(l<r)
		if(x<=(l+r>>1)) ls[p]=upd(ls[pre],l,l+r>>1,x);
		else rs[p]=upd(rs[pre],(l+r>>1)+1,r,x);
	return p;
}
int query(int u,int v,int l,int r,int k){
	if(l>=r) return l;
	int num=sum[ls[v]]-sum[ls[u]];
	if(num>=k) return query(ls[u],ls[v],l,l+r>>1,k);
	else return query(rs[u],rs[v],(l+r>>1)+1,r,k-num);
}
int main(){
	int n,m,cnt,l,r,k,temp;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",a+i),copy_[i]=a[i];
	sort(copy_+1,copy_+1+n),cnt=unique(copy_+1,copy_+1+n)-(copy_+1);
	tree[0]=build(1,cnt);
	for(int i=1;i<=n;++i) tree[i]=upd(tree[i-1],1,cnt,lower_bound(copy_+1,copy_+1+cnt,a[i])-(copy_+1));
	while(m--) scanf("%d%d%d",&l,&r,&k),printf("%d\n",copy_[query(tree[l-1],tree[r],1,cnt,k)]);
	return 0;
}
2020/7/30 16:07
加载中...