【洛谷】P3919 【模板】可持久化线段树(主席树)
题目
传送门:QWQ
分析
主席树的模板,囤着
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int N=1000010; int ls[N*20], rs[N*20], root[N*20], newp, sum[N*20], a[N*20]; inline void insert(int l,int r,int x,int pos,int& cur,int cur1) { cur=++newp; ls[cur]=ls[cur1]; rs[cur]=rs[cur1]; sum[cur]=sum[cur1]; if(l==r) { sum[cur]=x; return; } int mid=l+r>>1; if(pos<=mid) insert(l,mid,x,pos,ls[cur],ls[cur1]); else insert(mid+1,r,x,pos,rs[cur],rs[cur1]); } inline void build(int l,int r,int& cur) { cur=++newp; if(l==r) { sum[cur]=a[l]; return; } int mid=l+r>>1; build(l,mid,ls[cur]); build(mid+1,r,rs[cur]); } inline int query(int l,int r,int pos,int cur) { if(l==r) return sum[cur]; int mid=l+r>>1; if(pos<=mid) return query(l,mid,pos,ls[cur]); else return query(mid+1,r,pos,rs[cur]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,root[0]); int v1,opt,x,pos; for(int i=1;i<=m;i++) { scanf("%d%d",&v1,&opt); root[i]=root[v1]; if(opt==1){ scanf("%d%d",&pos,&x); insert(1,n,x,pos,root[i],root[i]); } else{ scanf("%d",&pos); printf("%d\n",query(1,n,pos,root[v1])); } } return 0; }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步