样例过不去,照着题解写的,求调
查看原帖
样例过不去,照着题解写的,求调
930076
mmdxmakioi楼主2023/3/23 16:46
#include<cstdio>
#include<algorithm>
//#define int long long
using namespace std;
int a[200001];
int b[200001];
int n,m;
int cnt;
int sum[6400001];
int T[200001];
int R[6400001];
int L[6400001];
int build(int l,int r)
{
	int rt=++cnt;
	sum[rt]=0;
	if(l==r)
	{
		return rt;
	}
	int mid=(l+r)/2;
	L[rt]=build(l,mid);
	R[rt]=build(mid+1,r);
	return rt;
}
int update(int pre,int l,int r,int x)
{
	int rt=++cnt;
	L[rt]=L[pre];
	L[rt]=R[pre];
	sum[rt]=sum[pre]+1;
	int mid=(l+r)/2;
	if(l==r)
	return rt;
	if(x<=mid)
	{
		L[rt]=update(L[pre],l,mid,x);
	}
	else
	{
		R[rt]=update(R[pre],mid+1,r,x);
	}
	return rt;
}
int query(int u,int v,int l,int r,int k)
{
	if(l>=r)
	{
		return l;
	}
	int s=sum[L[v]]-sum[L[u]],mid=(l+r)/2;
//	printf("%d %d %d\n",s,u,v);
	if(k<=s)
	{
		return query(L[u],L[v],l,mid,k);
	}
	else
	{
		return query(R[u],R[v],mid+1,r,k-s);
	}
}
int main()
{
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	int m=unique(b+1,b+1+n)-b-1;
	T[0]=build(1,m);
//	printf("%d\n",cnt);
	for(i=1;i<=n;i++)
	{
		int t=lower_bound(b+1,b+1+m,a[i])-b;
//		printf("%d\n",t);
		T[i]=update(T[i-1],1,m,t);
	}
	for(i=1;i<=m;i++)
	{
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		int t=query(T[x-1],T[y],1,m,k);
		printf("%d\n",b[t]);
	}
}
2023/3/23 16:46
加载中...