可持久化数组

P3919 【模板】可持久化数组

震惊,可持久化数组竟然使用可持久化线段树维护

使用可持久化线段树维护,就只有单点修改和单点查询

然后,还有一个小坑点,就是查询时也会生成一个与所使用的历史版本一样的版本

不然只有20分

~


#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
const int maxn=1e5+10;
int ls[maxn<<5],rs[maxn<<5],T;
int t[maxn<<5];
int root[maxn];
int base[maxn];
int read()
{
    char c=getchar();
    int res=0,f=1;
    while(c<'0'||c>'9')
    {
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0')
    {
        res=(res<<3)+(res<<1)+c-'0';
        c=getchar();
    }
    return res*f;
}
void build(int l,int r,int &R)
{
    R=++T;
    if(l==r)
    {
        t[R]=base[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(l,mid,ls[R]);
    build(mid+1,r,rs[R]);
}
int refix(int R,int pos,int val,int l,int r)
{
    int nxt=++T;
    ls[nxt]=ls[R];
    rs[nxt]=rs[R];
    if(l==r)
    {
        t[nxt]=val;
        return nxt;
    }
    int mid=(l+r)>>1;
    if(pos<=mid)
        ls[nxt]=refix(ls[R],pos,val,l,mid);
    else
        rs[nxt]=refix(rs[R],pos,val,mid+1,r);
    return nxt;
}
int check(int R,int loc,int l,int r)
{
    if(l==r)
        return t[R];
    int mid=(l+r)>>1;
    if(loc<=mid)
        return check(ls[R],loc,l,mid);
    else
        return check(rs[R],loc,mid+1,r);
}
int main()
{
    int n=read(),m=read();
    for(int i=1;i<=n;i++)
        base[i]=read();
    build(1,n,root[0]);
    int v,opt,loc,value;
    for(int i=1;i<=m;i++)
    {
        v=read();opt=read();loc=read();
        if(opt==1)
        {
            value=read();
            root[i]=refix(root[v],loc,value,1,n);
        }
        else
        {
            root[i]=root[v];
            printf("%d\n",check(root[v],loc,1,n));  
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/Lance1ot/p/9511762.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值