求助主席树(指针)
查看原帖
求助主席树(指针)
550957
Anonymely楼主2022/7/30 14:13
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+5;
#define orz puts("fuck!!!") 

int n,m,a[N];

int b[N];

struct chairman_segment_tree{
	#define md(l,r) ((l+r)>>1)
	
	struct node{
		int l,r,w;
		node *ls, *rs;
	};
	
	node* root[N];
	
	void pushup(node* p) {
		p -> w = p -> ls -> w + p -> rs -> w; 
		//orz;
	}
	
	void build(node* &p,int l,int r) {
		p = new node();
		p -> l = l, p -> r = r;
		//p -> w = 0; 
		if (l == r) {
			p -> w = 0;
			return ;
		} 
		int mid = md(l, r);
		build(p -> ls, l, mid);
		build(p -> rs, mid + 1, r);
		pushup(p); 
	}
	
	void update(node* p,node* lst,int k,int v) {
		//if (lst == NULL) return ;
		
		if (p == NULL) p = new node();
		p -> l = lst -> l;
		p -> r = lst -> r;
		//cout<<p -> l<<' '<<p -> r<<endl; 
		if (p -> l == p -> r) {
			p -> w = lst -> w + v;
			//orz;
			return ;
		}
		int mid = md(p -> l, p -> r);
		if (k <= mid) p -> rs = lst -> rs,update(p -> ls, lst -> ls, k, v);
		else p -> ls = lst -> ls,update(p -> rs, lst -> rs, k, v);
		pushup(p);
		//orz;
	}
	
	int query(node *u,node *v,int k) {
		if (u -> l == u -> r) return u -> l;
		int mid = md(u -> l, u -> r);
		int tmp = v -> ls -> w - u -> ls -> w;
		if (tmp >= k) return query(u -> ls, v -> ls, k);
		else return query(u -> rs, v -> rs, k - tmp);
	} 
	
}T;

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	int up=unique(b+1,b+n+1)-b-1;
	T.build(T.root[0],1,up);
	//orz;
	for(int i=1;i<=n;i++){
		int now=lower_bound(b+1,b+up+1,a[i])-b;
		//cout<<now<<endl;
		T.update(T.root[i],T.root[i-1],now,1);
	}
	for(int i=1;i<=m;i++){
		int l,r,k;cin>>l>>r>>k;
		cout<<b[T.query(T.root[l-1],T.root[r],k)]<<endl;
	}
	return 0;
}

RE

2022/7/30 14:13
加载中...