主席树求条
查看原帖
主席树求条
322792
Alea楼主2023/11/5 08:30

第二个点和最后一个点一个 WA 了另一个 TLE 了怎么办?

#include <iostream>
using namespace std;
const int SIZE=1e6+10;
int a[SIZE],n,m,q,rt[SIZE*20],ch[SIZE*20][2],val[SIZE*20],cnt;
void build(int &co,int lf,int rt){
    co=++cnt;
    if(lf==rt) return val[co]=a[lf],void();
    int mi=lf+(rt-lf)/2;
    build(ch[co][0],lf,mi),build(ch[co][1],mi+1,rt);
}
void modify(int &co,int lf,int rt,int qu,int mq,int mv){
    co=++cnt;
    ch[co][0]=ch[qu][0],ch[co][1]=ch[qu][1],val[co]=val[qu];
    if(lf==rt) return val[co]=mv,void();
    int mi=lf+(rt-lf)/2;
    if(mq<=mi) modify(ch[co][0],lf,mi,ch[qu][0],mq,mv);
    else modify(ch[co][1],mi+1,rt,ch[qu][1],mq,mv);
}
int query(int co,int lf,int rt,int qx){
    if(lf==rt) return val[co];
    int mi=lf+(rt-lf)/2;
    if(qx<=mi) return query(ch[co][0],lf,mi,qx);
    else return query(ch[co][1],mi+1,rt,qx);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(rt[0],1,n);
    for(int i=1;i<=m;i++){
        int hi,opt,x,v;
        cin>>hi>>opt>>x;
        if(opt==1) cin>>v,modify(rt[i],1,n,rt[hi],x,v);
        if(opt==2) cout<<query(rt[hi],1,n,x)<<endl,rt[i]=rt[hi];
    }
    return 0;
}
2023/11/5 08:30
加载中...