社区讨论

80份求条

P3834【模板】可持久化线段树 2参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m4h4cqwx
此快照首次捕获于
2024/12/09 22:19
去年
此快照最后确认于
2025/11/04 13:04
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define MAXN 100507
using namespace std;
int tot,n,m,sum[MAXN<<5],rt[MAXN<<5],rs[MAXN<<5],ls[MAXN<<5],a[MAXN+105],ind[MAXN+105],len;
inline int getid(register const int &x){
	return lower_bound(ind+1,ind+len+1,x)-ind;
}
inline int build(register const int &l,register const int &r){
	int root=++tot;
	if(l==r) return root;
	register int mid=(l+r)>>1;
	rt[root]=build(l,mid);
	rs[root]=build(mid+1,r);
	return root;
}
inline int update(register const int &k,register const int &l,register const int &r,register const int &root) {
  register int dir = ++tot;
  ls[dir] = ls[root], rs[dir] = rs[root], sum[dir] = sum[root] + 1;
  if (l == r) return dir;
  register int mid =(l+r)>>1;
  if (k <= mid) ls[dir] = update(k, l, mid, ls[dir]);
  else rs[dir] = update(k, mid + 1, r, rs[dir]);
  return dir;
}
inline int query(register const int &u,register const int &v,register const int &l,register const int &r,register const int &k) {
	register int mid = l + r >> 1,
	x = sum[ls[v]] - sum[ls[u]]; 
	if (l == r) return l;
	if (k <= x) return query(ls[u], ls[v], l, mid, k);
	else return query(rs[u], rs[v], mid + 1, r, k - x);
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>n>>m;
	for(register int i(1);i<=n;i=-~i){
		cin>>a[i];
	}
	memcpy(ind, a, sizeof ind);
	sort(ind + 1, ind + n + 1);
	len = unique(ind + 1, ind + n + 1) - ind - 1;
	rt[0] = build(1, len);
	for (register int i(1);i<=n;i=-~i) rt[i] = update(getid(a[i]), 1, len, rt[i - 1]);
	while (m--){
		register int l,r,k;
		cin>>l>>r>>k;
		cout<<ind[query(rt[l-1], rt[r], 1, len, k)]<<'\n';
	}
}
为什么是80分

回复

1 条回复,欢迎继续交流。

正在加载回复...