萌新刚学OI,求助主席树
查看原帖
萌新刚学OI,求助主席树
233501
Dangerou楼主2021/11/17 17:03

WaWa 了第二个点,萌新很疑惑

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
inline int read()
{
    int num=0,w=1;char ch=getchar();
    while(ch<'0'||'9'<ch) {if(ch=='-') w=-1;ch=getchar();}
    while('0'<=ch&&ch<='9') {num*=10;num+=(ch-'0');ch=getchar();}
    return num*w;
}
int n,m,top;
int rt,opt,loc,val;
int root[10000001];
int a[10000001];
struct node
{
    int val;
    int l;
    int r;
}tree[10000001];
inline int add_new(int k)
{   
    tree[++top]=tree[k];
    return top;
}
inline int build(int k,int l,int r)
{
    k=++top;
    if(l==r)
    {
        tree[k].val=a[l];
        return top;
    }
    int mid=(l+r)>>1;
    tree[k].l=build(tree[k].l,l,mid);
    tree[k].r=build(tree[k].r,mid+1,r);
    return k;
}
inline int change(int k,int l,int r,int x,int v)
{
    k=add_new(k);
    if(l==r)
    {
        tree[k].val=v;
        return k;
    }
    int mid=(l+r)>>1;
    if(x<=mid)tree[k].l=change(tree[k].l,l,mid,x,v);
    else tree[k].r=change(tree[k].r,mid+1,r,x,v);
    return k;
}
inline int find(int k,int l,int r,int x)
{
    if(l==r) return tree[k].val;
    int mid=(l+r)>>1;
    if(x<=mid) return find(tree[k].l,l,mid,x);
    else return find(tree[k].r,mid+1,r,x);
}
int main()
{
#ifdef FIO
    freopen("D:/Code/In.in","r",stdin);
    freopen("D:/Code/Out.out","w",stdout);
#else
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    root[0]=build(0,1,n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&rt,&opt,&loc);
        if(opt==1)
        {
            scanf("%d",&val);
            root[i]=change(root[rt],1,n,loc,val);
        }
        if(opt==2)
        {
            printf("%d\n",find(root[rt],1,n,loc));
            root[i]=root[rt];
        }
    }
    return 0;
}
2021/11/17 17:03
加载中...