求助
查看原帖
求助
315398
小杨小小杨楼主2021/9/16 22:30

10pts,只过了第一个点

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
int n,m,i,b[maxn],L[4*maxn],R[4*maxn],s[4*maxn],num,num1,root[maxn],c[maxn],l,r,k;
struct Node{
	int num,Id;
}a[maxn];
bool cmp(Node x,Node y){return x.num<y.num;}
int make_tree(int l,int r){
	int now=++num1;
	if (l<r){
		int mid=(l+r)>>1;
		L[now]=make_tree(l,mid);
		R[now]=make_tree(mid+1,r);
	}
	return now;
}
int change_tree(int numk,int l,int r,int x){
	int now=++num1;
	L[now]=L[numk];R[now]=R[numk];
	s[now]=s[numk]+1;
	if (l<r){
		int mid=(l+r)>>1;
		if (x<=mid) L[now]=change_tree(L[now],l,mid,x);
		else R[now]=change_tree(R[now],mid+1,r,x);
	}
	return now;
}
int find_tree(int now,int las,int l,int r,int x){
	if (l==r) return l;
	int d=s[L[las]]-s[L[now]];
	int mid=(l+r)>>1;
	if (x<=d) return find_tree(L[now],L[las],l,mid,x);
	else return find_tree(R[now],R[las],mid+1,r,x);
}
int main(){
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++) scanf("%d",&a[i].num),a[i].Id=i;
	sort(a+1,a+n+1,cmp);
	b[a[1].Id]=++num;c[num]=a[1].num;
	for (i=2;i<=n;i++){
		if (a[i].num!=a[i-1].num) b[a[i].Id]=++num;
		else b[a[i].Id]=num;
		c[num]=a[i].num;
	}
	root[0]=make_tree(1,num);
	for (i=1;i<=n;i++)
		root[i]=change_tree(root[i-1],1,num,b[i]);
	for (i=1;i<=m;i++){
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",c[find_tree(root[l-1],root[r],1,num,k)]);
	}
	return 0;
}

2021/9/16 22:30
加载中...