洛谷 P3834 可持久化线段树 2(主席树)

因为太菜了,所以也不知道这题的算法到底应该叫做什么,看hzw博客中把这题归到主席树了,那我也归到主席树里吧。
其实我连主席树定义都不知道…
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,m,x,y,t,cnt;
int a[N],b[N],ll[N<<5],rr[N<<5],sum[N<<5],T[N];

int change(int pre,int l,int r,int x)
{
	int rt=++cnt;
	ll[rt]=ll[pre],rr[rt]=rr[pre],sum[rt]=sum[pre]+1;
	if (l<r)
	{
		int mid=l+r>>1;
		if (x<=mid) ll[rt]=change(ll[pre],l,mid,x);
		else rr[rt]=change(rr[pre],mid+1,r,x);
	}
	return rt;
}

int query(int u,int v,int l,int r,int x)
{
	if (l==r) return l;
	int now=sum[ll[v]]-sum[ll[u]];
	int mid=l+r>>1;
	if (x<=now) return query(ll[u],ll[v],l,mid,x);
	else return query(rr[u],rr[v],mid+1,r,x-now);
}

int main(){
	scanf("%d%d",&n,&q);
	for (register int i=1; i<=n; ++i) scanf("%d",&a[i]),b[i]=a[i]; 
	sort(a+1,a+n+1);
	m=unique(a+1,a+n+1)-a-1;
	for (register int i=1; i<=n; ++i)
	{
		t=lower_bound(a+1,a+m+1,b[i])-a;
		T[i]=change(T[i-1],1,m,t); 
	}
	while (q--)
	{
		scanf("%d%d%d",&x,&y,&t);
		t=query(T[x-1],T[y],1,m,t);
		printf("%d\n",a[t]);
	}
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值