求调
查看原帖
求调
91433
czy0407楼主2024/3/25 21:40
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct tree 
{
	int id,ls,rs,mark,sum;
}tr[N<<6];
int n,m,cnt,a[N],b[N],c[N],top,rt[N],v,q,loc,val;
int build(int u,int l,int r)
{
	u=++cnt;
	int mid=(l+r)>>1;
	if(l<r)
	{
		tr[u].ls=build(tr[u].ls,l,mid);
		tr[u].rs=build(tr[u].rs,mid+1,r);
	}
	return u; 
}	
int clone(int u)
{
	++cnt;
	tr[cnt]=tr[u];
	return cnt;
}
int up(int u,int l,int r,int val)
{
	u=clone(u);
	tr[u].sum++;
	int mid=(l+r)>>1;
	if(l<r)
	{
		if(val<=mid)tr[u].ls=up(tr[u].ls,l,mid,val);
		else tr[u].rs=up(tr[u].rs,mid+1,r,val);
	} 
	return u;
}
int query(int u,int v,int l,int r,int k)
{
	if(l>=r)return l;
	int mid=(l+r)>>1;
	int x=tr[tr[v].ls].sum-tr[tr[u].ls].sum;
	if(x>=k)return query(tr[u].ls,tr[v].ls,l,mid,x);
	else return query(tr[u].rs,tr[v].ls,mid+1,r,k-x);
	
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>n>>m;	
	for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	int len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+len+1,a[i])-b;
	rt[0]=build(1,1,len);
	for(int i=1;i<=n;i++)rt[i]=up(rt[i-1],1,len,a[i]);
	for(int i=1;i<=m;i++)
	{
		int l,r,k;
		cin>>l>>r>>k;
		cout<<b[query(rt[l-1],rt[r],1,len,k)]<<"\n";
	}
	return 0; 
}
2024/3/25 21:40
加载中...