可持久化线段树模板(洛谷3919查询历史版本)




代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 4;
struct T {
	int l,r,v;
}t[maxn*40]; 
int a[maxn],edition[maxn*40],tot;
int build(int l,int r)
{
	int p=++tot;
	if(l==r) {
		t[p].v=a[l]; return p;
	}
	int mid=(l+r)>>1;
	t[p].l=build(l,mid);
	t[p].r=build(mid+1,r);
	return p;
}
int update(int id,int l,int r,int k,int val)
{
	int p=++tot;
	if(l==r) {
		t[p].v=val; return p;
	}
	int mid=(l+r)>>1;
	t[p].l=t[id].l,t[p].r=t[id].r;
	if(k<=mid) t[p].l=update(t[p].l,l,mid,k,val);
	else t[p].r=update(t[p].r,mid+1,r,k,val);
 	return p;
}
int query(int id,int l,int r,int k)
{
	if(l==r) return t[id].v;
	int mid=(l+r)>>1;
	if(k<=mid) return query(t[id].l,l,mid,k);
	else return query(t[id].r,mid+1,r,k);
}
int main()
{
	int n,m,id,op,k,val;
	scanf("%d%d",&n,&m); 
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,n);
	edition[0]=1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&id,&op,&k);
		if(op==1) {
			scanf("%d",&val);
			edition[i]=update(edition[id],1,n,k,val);
		}
		else {
			edition[i]=edition[id];
			printf("%d\n",query(edition[id],1,n,k));
		}
	}
	return 0;
} 


全部评论

相关推荐

翱翔龙骑:耗材的幻想
点赞 评论 收藏
分享
大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务