求问主席树
查看原帖
求问主席树
389425
__ex楼主2023/8/12 16:15

注释部分感觉写的没什么大区别,但是就是过不了

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
template<typename T>inline T read(){
    T a=0;bool s=0;
    char ch=getchar();
    while(ch>'9' || ch<'0'){
        if(ch=='-')s^=1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        a=(a<<3)+(a<<1)+(ch^48);
        ch=getchar();
    }
    return s?-a:a;
}
const int mn=1e6+10;
int n,m,tot,a[mn],root[mn];
struct stree{
    int l,r,lc,rc,dat;
    #define l(x) tr[x].l
    #define r(x) tr[x].r
    #define lc(x) tr[x].lc
    #define rc(x) tr[x].rc
    #define dat(x) tr[x].dat
}tr[mn*30];
void build(int &now,int l,int r){
    now=++tot;
    l(now)=l;r(now)=r;
    if(l==r){
        dat(now)=a[l];
        return;
    }
    int mid=l+r>>1;
    build(lc(now),l,mid);
    build(rc(now),mid+1,r);
}
// void cg(int &now,int las,int o,int num){
//     now=++tot;dat(now)=dat(las);
//     lc(now)=lc(las);rc(now)=rc(las);
//     if(l(now)==r(now)){dat(now)=num;return;}
//     int mid=l(now)+r(now)>>1;
//     if(o<=mid)cg(lc(now),lc(las),o,num);
//     else cg(rc(now),rc(las),o,num);
// }
// int ask(int now,int o){
//     if(l(now)==r(now))return dat(now);
//     int mid=l(now)+r(now)>>1;
//     if(o<=mid)return ask(lc(now),o);
//     else return ask(rc(now),o);
// }
void cg(int &now,int las,int o,int l,int r,int val){
    now=++tot;
    dat(now)=dat(las);
    lc(now)=lc(las);rc(now)=rc(las);
    if(l==r){dat(now)=val;return;}
    int mid=(l+r)>>1;
    if(o<=mid)cg(lc(now),lc(las),o,l,mid,val);
    else cg(rc(now),rc(las),o,mid+1,r,val);
}
int ask(int now,int l,int r,int o){
    if(l==r)return dat(now);
    int mid=(l+r)>>1;
    if(o<=mid)return ask(lc(now),l,mid,o);
    else return ask(rc(now),mid+1,r,o);
}
int main(){
    n=read<int>();m=read<int>();
    for(int i=1;i<=n;i++)
        a[i]=read<int>();
    build(root[0],1,n);
    for(int i=1;i<=m;i++){
        int k=read<int>();
        int op=read<int>(),num=read<int>();
        if(op==1)cg(root[i],root[k],num,1,n,read<int>());
        else printf("%d\n",ask(root[k],1,n,num)),root[i]=root[k];
    }
    // while(1)getchar();
    return 0;
}
2023/8/12 16:15
加载中...