求助!玄关!QAQ
  • 板块灌水区
  • 楼主Secret_Sky_2021
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/26 15:18
  • 上次更新2024/1/26 15:24:28
查看原帖
求助!玄关!QAQ
601270
Secret_Sky_2021楼主2024/1/26 15:18

主席树代码求调,模板 原题目

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,nN;
int a[N],b[N],c[N],x,y,k;
struct tree{
	struct pw{
		int x,l,r;
	} h[N<<5];
	int root[N];
	int tot;
	inline int build(int x,int l,int r){
		x=++tot;
		if(l==r) return x;
		int mid=(l+r)>>1;
		h[x].l=build(h[x].l,l,mid);
		h[x].r=build(h[x].r,mid+1,r);
		return x;
	}
	inline int copy(int p){
		h[++tot]=h[p];
		h[tot].x++;
		return tot;
	}
	inline int update(int x,int l,int r,int pos){
		x=copy(x);
		if(l==r) return x;
		int mid=(l+r)>>1;
		if(pos<=mid) h[x].l=update(h[x].l,l,mid,pos);
		else h[x].r=update(h[x].r,mid+1,r,pos);
		return x;
	}
	inline int quary(int l,int r,int dl,int dr,int k){
		if(l==r) return b[l];
		int mid=(l+r)>>1;
		int ln=h[h[dr].l].x-h[h[dl].l].x;
		if(k<=ln) return quary(l,mid,h[dl].l,h[dr].l,k);
		else return quary(mid+1,r,h[dl].r,h[dr].r,k-ln);
	}
	
}PST ;

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) b[i]=a[i];
	sort(b+1,b+n+1);
	nN=unique(b+1,b+1+n)-b-1;
	PST.root[0]=PST.build(PST.root[0],1,n);
	for(int i=1;i<=n;i++) c[i]=upper_bound(b+1,b+nN+1,a[i])-b;
	for(int i=1;i<=n;i++){
		PST.root[i]=PST.update(PST.root[i-1],1,nN,c[i]);
	}
	for(int i=1;i<=m;i++){
		cin>>x>>y>>k;
		cout<<PST.quary(1,nN,PST.root[x-1],PST.root[y],k)<<endl;
	}
	return 0;
} 
2024/1/26 15:18
加载中...