全RE 本地手测没问题 可持久化线段树(主席树)模板
查看原帖
全RE 本地手测没问题 可持久化线段树(主席树)模板
1420058
HaloisAWA楼主2024/11/12 22:03
#include<bits/stdc++.h>
using namespace std;
struct segtree{
	int l,r,sum;//l,r分别表示当前树的左右子树 
} tr[200010 * 40];
int n,m,a[200010],b[200010],cntb,cnt,root[200010 * 40];
int update(int pre,int pl,int pr,int x) {//pre表示当前子树的前一个快照 
	int rt = ++cnt,mid = (pl + pr) >> 1;
	tr[rt].l = tr[pre].l;
	tr[rt].r = tr[pre].r;
	tr[rt].sum = tr[pre].sum + 1;
	if (pl == pr) return rt;
	if (x <= mid) tr[rt].l = update(tr[pre].l,pl,mid,x);
	else tr[rt].r = update(tr[pre].r,mid + 1,pr,x);
	return rt;
}
int query(int u,int v,int pl,int pr,int k) {
	if (pl == pr) return pl;
	int x = tr[tr[v].l].sum - tr[tr[u].l].sum,mid = (pl + pr) >> 1;
	if (x >= k) return query(tr[u].l,tr[v].l,pl,mid,k);
	else query(tr[u].r,tr[v].r,mid + 1,pr,k);
}
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);//排序,重要! 
	cntb = unique(b + 1,b + n + 1) - b - 1;
	for (int i = 1;i <= cntb;i ++) {
		int x = lower_bound(b + 1,b + cntb + 1,a[i]) - b;//是b 
		root[i] = update(root[i - 1],1,cntb,x);//是cntb 
	}
	for (int i = 1;i <= m;i ++) {
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",b[query(root[l - 1],root[r],1,cntb,k)]);
	}
	return 0;
}

2024/11/12 22:03
加载中...