洛谷P3919 题解

题目链接

\(Solution:\)

可持久化线段树模板题
我们使用元区间(即\(l==r\))来存储数组中的元素

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+50;
int n,m,len,a[N],b[N],tmp,pre[N],rt[N],tot;
map<int,int> mp;
struct segtree
{
    int ls,rs,val;
}tree[N<<4];            
inline int read()
{
    int val=0,f=1;
    char ch=0;
    while(!isdigit(ch))
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        val=(val<<1)+(val<<3)+(ch^48);
        ch=getchar();
    }
    return val*f;
}
inline int clone(int x)
{
    tot++;
    tree[tot]=tree[x];
    return tot;
}
inline void pushup(int x)
{
    tree[x].val=tree[tree[x].ls].val+tree[tree[x].rs].val;
}
inline int build(int t,int l,int r)
{
    t=++tot;
    if(l==r)
    {
        tree[t].val=a[l];
        return tot;
    }
    int mid=(l+r)>>1;
    tree[t].ls=build(tree[t].ls,l,mid);
    tree[t].rs=build(tree[t].rs,mid+1,r);
    return t;
}
inline int update(int x,int l,int r,int pos,int c)
{
    x=clone(x);
    if(l==r)
    {
        tree[x].val=c;
        return x;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) tree[x].ls=update(tree[x].ls,l,mid,pos,c);
    else tree[x].rs=update(tree[x].rs,mid+1,r,pos,c);
    return x;
}
inline int query(int x,int l,int r,int pos)
{
    if(l==r) return tree[x].val;
    int mid=(l+r)>>1;
    if(pos<=mid) return query(tree[x].ls,l,mid,pos);
    return query(tree[x].rs,mid+1,r,pos);

}
int main(void)
{
    n=read(),m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    rt[0]=build(0,1,n);
    for(int i=1;i<=m;i++)
    {
        int xxj=read(),op=read(),x=read();
        if(op==1)
        {
            int y=read();
            rt[i]=update(rt[xxj],1,n,x,y); 
        }
        else
        {
            printf("%d\n",query(rt[xxj],1,n,x));
            rt[i]=rt[xxj];
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lgj-lgj/p/12334799.html