求条,杨李卫国
查看原帖
求条,杨李卫国
926886
kind_Ygg楼主2024/10/8 16:08
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int tree[N<<5],ls[N<<5],rs[N<<5];//节点值 左子树编号 有字数编号
int root[N];//第i棵线段树gen的编号
int n,q;
int a[N],b[N],f[N];//原数组 离散化后数组
int tot=0;//当前编号
int x,y,k;
bool cmp(int a,int b){return a<b;}
int build(int l,int r)
{
	int rt=++tot;
	if(l==r) return rt;
	int mid=l+((r-l)>>1);
	ls[rt]=build(l,mid);
	rs[rt]=build(mid+1,r);
	return rt;
}
int update(int rt,int l,int r,int num)
{
	int pre=++tot;
	ls[pre]=ls[rt];
	rs[pre]=rs[rt];
	tree[pre]=tree[rt]+1;
	if(l==r) return pre;
	int mid=l+((r-l)>>1);
	if(num<=mid) ls[pre]=update(ls[rt],l,mid,num);
	else rs[pre]=update(rs[rt],mid+1,r,num);
	return pre;
}
int query(int l,int r,int k,int s,int t)
{
	if(s==t) return s;
	int cf=tree[r]-tree[l];
	int mid=s+((t-s)>>1);
	if(k<=cf) return query(ls[l],ls[r],k,s,mid);
	else return query(rs[l],rs[r],k-cf,mid+1,t);
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1,cmp);
	int len=unique(b+1,b+n+1)-b-1;
	root[0]=build(1,len);
	for(int i=1;i<=n;i++)
	{
		f[i]=lower_bound(b+1,b+len+1,a[i])-b;
		root[i]=update(root[i-1],1,len,f[i]);
	}
	while(q--)
	{
		cin>>x>>y>>k;
		cout<<b[query(root[x-1],root[y],k,1,len)]<<'\n';
	}
	return 0;
}
2024/10/8 16:08
加载中...