求助:WA了3个点
查看原帖
求助:WA了3个点
182172
zzx0826楼主2020/7/29 21:06
#include <bits/stdc++.h>
#define hash h
using namespace std;
const int N = 1e5 + 5;
int n,q,cnt,a[N],k,hash[N],tot,tree[N],ll[32 * N],rr[32 * N],sum[32 * N],l,r;
int make_tree(int l,int r)
{
	cnt++;
	int p = cnt;
	if(l < r)
	{
		ll[p] = make_tree(l,(l + r) >> 1);
		rr[p] = make_tree(((l + r) >> 1) + 1,r);
	}
	return p;
}
int add(int pre,int l,int r,int x)
{
	cnt++;
	int p = cnt;
	ll[p] = ll[pre],rr[p] = rr[pre],sum[p] = sum[pre] + 1;
	if(l < r)
	{
		int mid = (l + r) >> 1;
		if(x <= mid)ll[p] = add(ll[pre],l,mid,x);
		else rr[p] = add(rr[pre],mid + 1,r,x);
	}
	return p;
}
int gets(int u,int v,int l,int r,int x)
{
	if(l >= r)return l;
	int mid = (l + r) >> 1;
	int num = sum[ll[v]] - sum[ll[u]];
	if(num >= x)return gets(ll[u],ll[v],l,mid,x);
	else return gets(rr[u],rr[v],mid + 1,r,x - num);
}
int main()
{
    //freopen("P3834_3.in","r",stdin);
    //freopen("out.out","w",stdout);
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),hash[i] = a[i];
	sort(hash + 1,hash + 1 + n);
	int tot = unique(hash + 1,hash + 1 + n) - hash - 1;
	tree[0] = make_tree(1,tot);
	for(int i=1;i<=n;i++)
	{
		int x = lower_bound(hash + 1,hash + 1 + n,a[i]) - hash;
		tree[i] = add(tree[i - 1],1,tot,x);
	}
	while(q--)
	{
		scanf("%d %d %d",&l,&r,&k);
		int x = gets(tree[l - 1],tree[r],1,tot,k);
		printf("%d\n",hash[x]);
	}
	return 0;
}

WA了3个点: 求助各位大佬啊

2020/7/29 21:06
加载中...