在AcWing能过,为何洛谷会全部RE呢?
查看原帖
在AcWing能过,为何洛谷会全部RE呢?
3107
youchengyuanzhi楼主2021/12/2 00:31
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn],T[maxn];
int cnt;
struct tree{
	int l,r,sum;
}sg[maxn*40];
int insert(int l,int r,int pre,int k)
{
	int nw=++cnt;
	sg[cnt]=sg[pre];
	sg[cnt].sum++;
	if(l<r)
	{
		int mid=l+r>>1;
		if(k<=mid)	sg[cnt].l=insert(l,mid,sg[pre].l,k);
		else sg[cnt].r=insert(mid+1,r,sg[pre].r,k);
	}
	return nw;
}
int query(int l,int r,int pre,int nw,int k)
{
	if(l==r) return l;
	int s=sg[sg[nw].l].sum-sg[sg[pre].l].sum;
	int mid=l+r>>1;
	if(s>=k) return query(l,mid,sg[pre].l,sg[nw].l,k);
	else query(mid+1,r,sg[pre].r,sg[nw].r,k-s);
}
int main()
{
	int n,m,l,r,k;
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	int len=unique(b+1,b+1+n)-b-1;
	for(int i=1; i<=n; i++)
	{
		int val=lower_bound(b+1,b+1+len,a[i])-b;
		T[i]=insert(1,len,T[i-1],val);
	}
	for(int i=1; i<=m; i++)
	{
		scanf("%d%d%d",&l,&r,&k);
		int ans=query(1,len,T[l-1],T[r],k);
		printf("%d\n",b[ans]);
	}
	return 0;
}
2021/12/2 00:31
加载中...