主席树0分求调
查看原帖
主席树0分求调
922019
xiaoniu142857楼主2024/11/24 16:23

0分求调!
提交记录

#include <cstdio>
#define N 1000001
#define rep(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
struct Node{int l,r,v;} t[N<<5];
int a[N],hd[N],l;
inline void read(int &x)
{
    int f=1,c;
    while((c=getchar())<'0'||c>'9') if(c=='-') f=-1;
    for(x=c^48;(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^48));
    x*=f;
}
int build(int pl,int pr)
{
    int rt=++l;
    if(pl==pr)
    {
        t[rt].v=a[pr];
        return rt;
    }
    int mid=pl+pr>>1;
    t[rt].l=build(pl,mid);
    t[rt].r=build(mid+1,pr);
    return rt;
}
int query(int pos,int p,int pl,int pr)
{
    //printf("query %d %d %d %d\n",pos,p,pl,pr);
    if(pl==pr)
    {
        return t[p].v;
    }
    int mid=pl+pr>>1;
    if(pos<=mid) query(pos,t[p].l,pl,mid);
    else query(pos,t[p].r,mid+1,pr);
}
int update(int pos,int val,int p,int pl,int pr)
{
    int rt=++l;
    t[rt]=t[p];
    if(pl==pr)
    {
        t[rt].v=val;
        return rt;
    }
    int mid=pl+pr>>1;
    if(pos<=mid) t[rt].l=update(pos,val,t[p].l,pl,mid);
    else t[rt].r=update(pos,val,t[p].r,mid+1,pr);
    return rt;
}
// void print()
// {
//     printf("==================\n");
//     rep(i,1,l)
//     {
//         printf("Node %d ls:%d rs:%d val:%d\n",i,t[i].l,t[i].r,t[i].v);
//     }
//     rep(i,0,10)
//     {
//         printf("Verson %d : %d\n",i,hd[i]);
//     }
// }
int main()
{
    int n,m,ver,opt,pos,val,ans;
    read(n),read(m);
    rep(i,1,n) read(a[i]);
    hd[0]=build(1,n);
    //print();
    rep(i,1,m)
    {
        read(ver),read(opt);
        if(opt==1)
        {
            read(pos),read(val);
            hd[i]=update(pos,val,hd[ver],1,n);
            //print();
        }
        else
        {
            read(pos);
            printf("%d\n",query(pos,hd[ver],1,n));
            hd[i]=hd[ver];
        }
    }
    return 0;
}

自己算了一下空间,才360MB,不应该MLE啊?

2024/11/24 16:23
加载中...