10pts,wa on 1-9
查看原帖
10pts,wa on 1-9
1121010
wangjingyuan666楼主2024/12/27 22:16
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e7+5;
int tot,root[N],n,m,a[N],f[N];
struct node{
	int lson,rson,val;
}tree[N<<5];
 int build(int l, int r){
    int id = ++ tot;
    if(l!=r){
    	int mid=(l+r)>>1;
        tree[id].lson = build(l, mid);
        tree[id].rson = build(mid+1, r);
    }
    return id;
}
int update(int l,int r,int pre,int x){
	int id=++tot;
	tree[id]=tree[pre];
	tree[id].val=tree[pre].val+1;
	if(l!=r){
    	int mid=l+r>>1;
    	if(x<=mid){
    		tree[id].lson=update(l,mid,tree[pre].lson,x);
		}else{
			tree[id].rson=update(mid+1,r,tree[pre].rson,x);
		}
    }
    return id;
}
int query(int l,int r,int u,int v,int k) //第k小 
{
	if(l==r) return f[l];
	int m=(l+r)>>1;
	int num=tree[tree[v].lson].val-tree[tree[u].lson].val;
	if(num>=k) return query(l,m,tree[u].lson,tree[v].lson,k);
	else return query(m+1,r,tree[u].rson,tree[v].rson,k);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i]=a[i];
	}
	sort(f+1,f+1+n);
	int size=unique(f+1,f+1+n)-f-1;
	
	root[0]=build(1,size);
	for(int i=1;i<=n;i++){
		int x=lower_bound(f+1,f+1+size,a[i])-f;
		root[i]=update(1,size,root[i-1],x);
	}
	for(int i=1;i<=m;i++){
		int l,r,k;
		cin>>l>>r>>k;
		cout<<query(1,size,root[l-1],root[r],k)<<endl;
	}
	return 0;
} 
2024/12/27 22:16
加载中...