help~~~~ P3834 【模板】可持久化线段树 2
查看原帖
help~~~~ P3834 【模板】可持久化线段树 2
367953
_Inzaghi_楼主2021/12/4 16:28

RT

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;

#define N 2*1000000

int tot,k;
int lc[N],rc[N],sum[N];
int n,m;
int a[N],bin[N],t[N];

void build(int &zz,int qq,int yy){
	zz = ++ tot;
	if(qq == yy) return ;
	int mid = (qq + yy) >> 1;
	build(lc[zz],qq,mid);
	build(rc[zz],mid + 1,yy);
}

void change(int p,int v,int l,int r,int &x){
	x =++ tot;
	lc[x] = lc[p];
	rc[x] = rc[p];
	sum[x] = sum[p] + 1;
	if(l == r) return;
	int mid = (l + r) >> 1;
	if(v <= mid) change(lc[p],v,l,mid,lc[x]);
	else change(rc[p],v,mid + 1,r,rc[x]);
}

int query(int k,int l,int r,int x,int y){
	if(l == r) return 1;
	int s = sum[lc[y]] - sum[lc[x]],mid = (l + r) >> 1;
	if(s < k) return query(k - s,mid + 1,r,rc[x],rc[y]);
	else return query(k,l,mid,lc[x],lc[y]);
}

int main(){
	tot = 0;
	cin>>n>>m;
	for(int i = 1 ;i <= n ;i++){
		cin >> a[i];
		bin[i] = a[i];
		t[i] = 0;
	}	
	sort(bin + 1,bin + n + 1);
	int cnt = unique(bin + 1 , bin + n + 1) - bin - 1;
	t[0] = 0;
	for(int i = 1;i <= n ;i++){
			a[i] = lower_bound(bin + 1,bin + cnt + 1,a[i]) - bin;
			change(t[i - 1],a[i],1,cnt,t[i]);
	}
	int x,y,k;
	while(m--){
		cin>>x>>y>>k;
		cout<<bin[query(k,1,cnt,t[x - 1],t[y])]<<endl;
	}	
	return 0;
}
2021/12/4 16:28
加载中...