20分RE求助
查看原帖
20分RE求助
740329
sunaohua楼主2023/3/21 18:06
#include<bits/stdc++.h>
using namespace std;
struct node {
	int num;
	int val;
} c[400005];
const int maxn=20000005;
int L[maxn],R[maxn],sum[maxn],T[maxn];
int z[400005];
int zz[400005];
int cnt=0;
int build(int l,int r) {
	int num=++cnt;
	if(l!=r) {
		int mid=(l+r)/2;
		L[num]=build(1,mid);
		R[num]=build(mid+1,r);
	}
	return num;
}
int update(int pre,int l,int r,int x) {
	int num=++cnt;
	L[num]=L[pre];
	R[num]=R[pre];
	sum[num]=sum[pre]+1;
	if(l!=r) {
		int mid=(l+r)/2;
		if(x<=mid)
			L[num]=update(L[pre],l,mid,x);
		else
			R[num]=update(R[pre],mid+1,r,x);
	}
	return num;
}
int query(int u,int v,int l,int r,int k) {
	if(l==r)
		return zz[l];
	int mid=(l+r)/2;
	int num=sum[L[v]]-sum[L[u]];
	if(num>=k)
		return (query(L[u],L[v],l,mid,k));
	else
		return (query(R[u],R[v],mid+1,r,k-num));
}
bool cmp(node c1,node c2) {
	return c1.val<c2.val;
}
int main() {
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>c[i].val;
		c[i].num=i;
	}
	sort(c+1,c+n+1,cmp);
	int tot=0;
	for(int i=1; i<=n; i++) {
		if(c[i].val!=c[i-1].val)
			tot++;
		z[c[i].num]=tot;
		zz[i]=c[i].val;
	}
	T[0]=build(1,tot);
	for(int i=1; i<=n; i++) {
		T[i]=update(T[i-1],1,tot,z[i]);
	}

	int l,r,k;
	while(m--) {
		cin>>l>>r>>k;
		cout<<query(T[l-1],T[r],1,tot,k)<<endl;
	}
}
2023/3/21 18:06
加载中...