蒟蒻求助主席树
查看原帖
蒟蒻求助主席树
160484
cunzai_zsy0531kkksd12楼主2020/7/4 22:33
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e5+5;
struct PerSegTree{int lson,rson,val;}t[N<<4];
int root[N],a[N],b[N],n,m,tot=0;
int build(int l,int r){
	int p=++tot;
	if(l==r) return p;
	int mid=(l+r)>>1;
	t[p].lson=build(l,mid);
	t[p].rson=build(mid+1,r);
	return p;
}
int New(int p){
	t[++tot]=t[p];
	t[tot].val++;
	return tot;
}
int update(int p,int l,int r,int x){
	p=New(p);
	if(l==r) return p;
	int mid=(l+r)>>1;
	if(x<=mid) t[p].lson=update(t[p].lson,l,mid,x);
	else t[p].rson=update(t[p].rson,mid+1,r,x);
	return p;
}
int query(int u,int v,int l,int r,int k){
	if(l>=r) return l;
	int x=t[t[v].lson].val-t[t[u].lson].val;
	int mid=(l+r)>>1;
	if(x>=k) return query(t[u].lson,t[v].lson,l,mid,k);
	return query(t[u].rson,t[v].rson,mid+1,r,k-x);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+n+1);
	int m=unique(b+1,b+n+1)-b-1;
	root[0]=build(1,m);
	for(int i=1;i<=n;++i){
		a[i]=lower_bound(b+1,b+m+1,a[i])-b;
		root[i]=update(root[i-1],1,m,a[i]);
	}
	while(m--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",b[query(root[l-1],root[r],1,m,k)]);
	}
	return 0;
}

样例不过 太菜了 求助各位巨佬%%%

2020/7/4 22:33
加载中...