求助主席树,样例全输出26465
查看原帖
求助主席树,样例全输出26465
448884
快乐的大童楼主2022/3/13 18:41

RT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int R(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[40];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(10);
}
const int N=2e5+5;
struct node{
	int leftson,rightson;
}d[N<<6];
int n,nn,m;
int rt[N<<6],a[N],b[N],s[N<<6],cnt;
int gnn(int i){
	return lower_bound(a+1,a+n+1,b[i])-a;
}
int build(int l,int r){
	int p=++cnt;
	if(l==r) return p;
	int mid=(l+r)>>1;
	d[p].leftson=build(l,mid);
	d[p].rightson=build(mid+1,r);
	return p;
}
int insert(int l,int r,int k,int root){
	int p=++cnt;
	d[p]=d[root];
	s[p]=s[root]+1;
	if(l==r) return p;
	int mid=(l+r)>>1;
	if(k<=mid) d[p].leftson=insert(l,mid,k,d[root].leftson);
	else d[p].rightson=insert(mid+1,r,k,d[root].rightson);
	return p;
}
int query(int u,int v,int l,int r,int k){
	if(l==r) return l;
	int p=s[d[v].leftson]-s[d[u].leftson];
	int mid=(l+r)>>1;
	if(k<=p) return query(d[u].leftson,d[v].leftson,l,mid,k);
	else return query(d[u].rightson,d[v].rightson,mid+1,r,k-p);
}
int main(){
	nn=R(),m=R();
	for(int i=1;i<=nn;i++){
		b[i]=R();
		a[i]=b[i];
	} 
	sort(a+1,a+nn+1);
	n=unique(a+1,a+nn+1)-a-1;
	rt[0]=build(1,n);
	for(int i=1;i<=nn;i++){
		rt[i]=(1,n,gnn(i),rt[i-1]);
	}
	for(int i=1,l,r,k;i<=m;i++){
		l=R(),r=R(),k=R();
		write(a[query(rt[l-1],rt[r],1,n,k)]);
	}
}

2022/3/13 18:41
加载中...