洛谷P3919 【模板】可持久化线段树 1(可持久化数组)
作者:互联网
模板~昨天打组队被ds和计算几何卡了
今天是学习它们的day1(该不会每一天都是day1吧
存个模板.jpg
tips.主席树空间大概开30比较稳,然后爆了的话试试25左右
#include<bits/stdc++.h> using namespace std; const int N=int(1e6)+6; int rt[N*30],a[N]; struct persis_seg_tree{ int lc[N*30],rc[N*30],val[N*30],cnt; inline void build(int &o,int l,int r){ o=++cnt; if(l==r) {val[o]=a[l];return;} int mid=(l+r)>>1; build(lc[o],l,mid);build(rc[o],mid+1,r); } inline void ins(int &o,int pre,int l,int r,int x,int v){ o=++cnt; lc[o]=lc[pre];rc[o]=rc[pre];val[o]=val[pre]; if(l==r) {val[o]=v;return;} int mid=(l+r)>>1; if(x<=mid) ins(lc[o],lc[pre],l,mid,x,v); else ins(rc[o],rc[pre],mid+1,r,x,v); } inline int query(int o,int l,int r,int q){ if(l==r) return val[o]; int mid=(l+r)>>1; if(q<=mid) return query(lc[o],l,mid,q); else return query(rc[o],mid+1,r,q); } }tree; int n,m; int main(){ //freopen("lys.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); tree.build(rt[0],1,n); for(int i=1;i<=m;i++){ int pre,opt,x; scanf("%d%d%d",&pre,&opt,&x); if(opt==1) { int v; scanf("%d",&v); tree.ins(rt[i],rt[pre],1,n,x,v); } if(opt==2) { printf("%d\n",tree.query(rt[pre],1,n,x));rt[i]=rt[pre]; } } }
标签:pre,洛谷,val,int,30,mid,rc,持久,P3919 来源: https://www.cnblogs.com/liyishui2003/p/16542658.html