C10 可持久化数组

视频链接:267 可持久化数组_哔哩哔哩_bilibili

 

Luogu P3919【模板】可持久化线段树 1(可持久化数组)

#include <iostream>
using namespace std;

#define N 1000005
#define lc(x) tr[x].l
#define rc(x) tr[x].r
int n,m,a[N];
struct node{
  int l,r;
  int v;
}tr[N*25];
int root[N],idx;

void build(int &x,int l,int r){
  x=++idx;
  if(l==r){
    tr[x].v=a[l]; return;
  }
  int m = l+r>>1;
  build(lc(x),l,m);
  build(rc(x),m+1,r);
}
void modify(int &x,int y,int l,int r,int pos,int v){
  x=++idx;
  tr[x]=tr[y];
  if(l==r){
    tr[x].v=v; return;
  }
  int mid = l+r>>1;
  if(pos<=mid) modify(lc(x),lc(y),l,mid,pos,v);
  else modify(rc(x),rc(y),mid+1,r,pos,v);
}
int query(int x,int l,int r,int pos){
  if(l==r) return tr[x].v;
  int mid = l+r>>1;
  if(pos<=mid) return query(lc(x),l,mid,pos);
  else return query(rc(x),mid+1,r,pos);
}
int main(){
  int ver,op,x,y;
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",a+i);
  build(root[0],1,n);
  for(int i=1;i<=m;i++){
    scanf("%d%d",&ver,&op);
    if(op==1){
      scanf("%d%d",&x,&y);
      modify(root[i],root[ver],1,n,x,y);      
    }
    else{
      scanf("%d",&x);
      printf("%d\n",query(root[ver],1,n,x));
      root[i]=root[ver];
    }
  }
}

 

posted @ 2022-08-11 16:09  董晓  阅读(399)  评论(1编辑  收藏  举报