全RE求调巨短主席树数据结构线段树绿名萌新在线秒回复热情
查看原帖
全RE求调巨短主席树数据结构线段树绿名萌新在线秒回复热情
180103
Ew_Cors楼主2022/10/27 10:04

RT.

#include<bits/stdc++.h>
using namespace std;

struct node{
	int ls,rs,sum;
}t[200005*(4+25)];
#define lp t[p].ls
#define rp t[p].rs
int nnode(int p){static int cnt=0;t[++cnt]=t[p];return cnt;}

void build(int &p,int l,int r){
	p=nnode(p);t[p].sum=0;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(lp,l,mid);build(rp,mid+1,r);
}

void insert(int &p,int l,int r,int k){
	p=nnode(p);t[p].sum++;
	if(l==r)return;
	int mid=(l+r)>>1;
	if(k<=mid)insert(lp,l,mid,k);
	else insert(rp,mid+1,r,k);
}

int query(int pl,int pr,int l,int r,int k){
	if(l==r)return l;
	int mid=(l+r)>>1,lsum=t[t[pr].ls].sum-t[t[pl].ls].sum;
	if(k<=lsum)query(t[pl].ls,t[pr].ls,l,mid,k);
	else query(t[pl].rs,t[pr].rs,mid+1,r,k-lsum);
}

int rt[200005];

int n,m,a[200005];
int b[200005],bcnt;

int main(){
	std::ios::sync_with_stdio(0);cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);bcnt=unique(b+1,b+n+1)-b-1;
	build(rt[0],1,bcnt);
	for(int i=1;i<=n;i++)
		insert(rt[i]=rt[i-1],1,bcnt,lower_bound(b+1,b+bcnt+1,a[i])-b);
	for(int i=1,l,r,k;i<=m;i++){
		cin>>l>>r>>k;
		cout<<b[query(rt[l-1],rt[r],1,bcnt,k)]<<endl;
	}
	return 0;
}
2022/10/27 10:04
加载中...