社区讨论

10pts 求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m4pe3lhd
此快照首次捕获于
2024/12/15 17:14
去年
此快照最后确认于
2025/11/04 12:47
4 个月前
查看原帖
CPP
 #include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int ls,rs,l,r,num;
}tr[5000105];
int n,m;
int a[200005],v[200005],cnt,f,tot,root[200005];
map<int,int> mp;
void build(int p,int l,int r){
	tr[p].l = l,tr[p].r = r;
	if(l == r) return ;
	int mid = (l + r) / 2;
	tr[p].ls = ++tot;
	build(tot,l,mid);
	tr[p].rs = ++tot;
	build(tot,mid + 1,r);
	return ;
}
void change(int p,int f,int k,int d){
	if(tr[d].l == tr[d].r){
		tr[d].num += k;
		return ;
	}
	int mid = (tr[p].l + tr[p].r) / 2;
	if(f <= mid){
		tr[d].ls = ++tot;
		tr[tot] = tr[tr[p].ls];
		change(tr[p].ls,f,k,tot);
		tr[d].num = tr[tr[d].ls].num + tr[tr[d].rs].num;
	}
	else{
		tr[d].rs = ++tot;
		tr[tot] = tr[tr[p].rs];
		change(tr[p].rs,f,k,tot);
		tr[d].num = tr[tr[d].ls].num + tr[tr[d].rs].num;
	}
	return ;
}
void found(int p,int d,int k){
	if(tr[p].l == tr[p].r){
		printf("%lld\n",v[tr[p].l]);
		return ;
	}
	int f = tr[tr[d].ls].num - tr[tr[p].ls].num;
	if(k <= f) found(tr[p].ls,tr[d].ls,k);
	else found(tr[p].rs,tr[d].rs,k);
	return ;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);
	//sort(a + 1,a + n + 1,cmp);
	a[0] = -1;
	for(int i = 1;i <= n;i++) if(a[i] != a[i - 1]) f++;
	build(0,1,f);
	for(int i = 1;i <= n;i++){
		if(!mp[a[i]]) mp[a[i]] = ++cnt,v[cnt] = a[i];
		root[i] = ++tot;
		tr[tot] = tr[root[i - 1]];
		change(root[i - 1],mp[a[i]],1,tot);
	}
	int l,r,k;
	for(int i = 1;i <= m;i++){
		scanf("%lld%lld%lld",&l,&r,&k);
		found(root[l - 1],root[r],k);
	}
	return 0;
}

回复

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

正在加载回复...