社区讨论

2*MLE求条 主席树

P1533可怜的狗狗参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mkqsfxev
此快照首次捕获于
2026/01/23 19:19
4 周前
此快照最后确认于
2026/01/24 09:44
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=300005;
int asort[maxn],cnt=0;
int arr[maxn],s=0;
int lft[maxn*25];
int rit[maxn*25];
int root[maxn];
int size[maxn*25];
int build(int l,int r)
{
	cnt++;
	int rt=cnt;
	if(l<r)
	{
		int mid=(l+r)>>1;
		lft[rt]=build(l,mid);
		rit[rt]=build(mid+1,r);
	}	
	return rt;
}
int insert(int x,int l,int r,int id)
{
	cnt++;int rt=cnt;
	lft[rt]=lft[id];rit[rt]=rit[id];
	size[rt]=size[id]+1;
	if(l<r)
	{
		int mid=(l+r)>>1;
		if(x<=mid)
		{
			lft[rt]=insert(x,l,mid,lft[rt]);
		}	
		else
		{
			rit[rt]=insert(x,mid+1,r,rit[rt]);
		}
	}
	return rt;
}
int query(int x,int l,int r,int u,int v)
{
	if(l==r)
	{
		return l;
	}
	int sz=size[lft[v]]-size[lft[u]];
	int mid=(l+r)>>1;
	if(sz>=x)
	{
		return query(x,l,mid,lft[u],lft[v]);
	}
	else
	{
		return query(x-sz,mid+1,r,rit[u],rit[v]);
	}
}
signed main()
{
	cin.tie(0);cout.tie(0);
	int n,m;
	cin>>n>>m;
	asort[0]=-1;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i];
		if(asort[s]!=arr[i])
		{
			s++;
			asort[s]=arr[i];
		}
	}
	sort(asort+1,asort+s+1);
	for(int i=1;i<=n;i++)
	{
		arr[i]=lower_bound(asort+1,asort+1+n,arr[i])-asort;
	}
	root[0]=build(1,n);
	for(int i=1;i<=n;i++)
	{
		root[i]=insert(arr[i],1,n,root[i-1]);
	}
	while(m--)
	{
		int l,r,x;
		cin>>l>>r>>x;
		cout<<asort[query(x,1,n,root[l-1],root[r])]<<"\n";
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...