SOS
查看原帖
SOS
356081
Night_7d5楼主2022/6/10 13:42
#include<bits/stdc++.h>
#define N 200005
using namespace std;
int n,m,a[N],tmp[N],b[N],roots[N],cnt,tot=1;
int ask(int num) {
	return lower_bound(b+1,b+cnt+1,num)-b;
}
struct node {
	int val,ls,rs;
}t[N<<5];
#define val(x) t[x].val
#define ls(x) t[x].ls
#define rs(x) t[x].rs
void build(int now,int l,int r) {
	if(l==r) {
		val(now)=0;
		return;
	}
	ls(now)=++tot;
	rs(now)=++tot;
	int mid=l+r>>1;
	build(ls(now),l,mid);
	build(rs(now),mid+1,r);
	val(now)=val(ls(now))+val(rs(now));
}
void add(int now,int pre,int pos,int l,int r) {
	if(l==r) {
		val(now)=val(pre)+1;
		return;
	}
	ls(now)=ls(pre),rs(now)=rs(pre),val(now)=val(pre)+1;
	int mid=l+r>>1;
	if(pos<=mid) ls(now)=++tot,add(ls(now),ls(pre),pos,l,mid);
	else  rs(now)=++tot,add(rs(now),rs(pre),pos,mid+1,r);
}
int query(int k,int now,int pre,int l,int r) {
	if(l==r) {
		return b[l];
	}
	int mid=l+r>>1;
	if(val(ls(now))-val(ls(pre))>=k) return query(k,ls(now),ls(pre),l,mid);
	else return query(k-val(ls(now))-val(ls(pre)),rs(now),rs(pre),mid+1,r);
}
int main() {
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		tmp[i]=a[i];
	}
	sort(tmp+1,tmp+n+1);
	for(int i=1;i<=n;i++) {
		if(i==1||tmp[i]!=tmp[i-1]) b[++cnt]=tmp[i];
	}
	roots[0]=1;
	build(1,1,cnt);
	for(int i=1;i<=n;i++) {
		roots[i]=++tot;
		add(roots[i],roots[i-1],ask(a[i]),1,cnt);
	}
	int l,r,k;
	for(int i=1;i<=m;i++) {
		scanf("%d %d %d",&l,&r,&k);
		int ans=query(k,roots[r],roots[l-1],1,cnt);
		printf("%d\n",ans);
	}
	return 0;
}

20分QwQ,只AC了测试点1,2

2022/6/10 13:42
加载中...