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

P3319】题解

一:【题意】

二:【解法】

三:【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,M=4*N+log2(N)*N;
int a[N];
int rt[N];
struct node{
    int l,r;
    int sum;
    int son[2];
    #define l(q) tree[q].l
    #define r(q) tree[q].r
    #define sum(q) tree[q].sum
    #define ls(q) tree[q].son[0]
    #define rs(q) tree[q].son[1]
}tree[M];
int cnt;
void build(int &q,int l,int r){
    if(q==0) q=++cnt;
    l(q)=l;r(q)=r;
    if(l==r){
        sum(q)=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(ls(q),l,mid);
    build(rs(q),mid+1,r);
}
void update(int las,int &now,int tp,int d){
    if(now==0) now=++cnt;
    tree[now]=tree[las];

    int l=l(las),r=r(las);
    if(l==r){
        sum(now)=d;
        return ;
    }
    int mid=l+r>>1;
    bool s=(tp>mid);
    update(tree[las].son[s],tree[now].son[s]=0,tp,d);
}
int query(int q,int tp){
    int l=l(q),r=r(q);
    if(l==r) return sum(q);
    int mid=l+r>>1;
    if(tp<=mid) return query(ls(q),tp);
    else return query(rs(q),tp);
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(rt[0],1,n);
    for(int i=1;i<=m;i++){
        int pre,op,p;cin>>pre>>op>>p;
        if(op==1){
            int d;cin>>d;
            update(rt[pre],rt[i],p,d);
        }
        else{
            rt[i]=rt[pre];
            cout<<query(rt[pre],p)<<"\n";
        }
    }
    return 0;
}
posted @ 2025-12-19 14:55  Ming3398  阅读(7)  评论(0)    收藏  举报