可持久化线段树24pts求调
查看原帖
可持久化线段树24pts求调
537998
lpx2024楼主2023/5/28 08:46
#include<bits/stdc++.h>
using namespace std;
const int maxN=4000010;
int stp,tot,a[maxN],c[maxN],lb[maxN],rb[maxN],ls[maxN],rs[maxN],loc[maxN];
void pushup(int k){
    c[k]=max(c[ls[k]],c[rs[k]]);
}
void build(int l,int r,int k){
    lb[k]=l,rb[k]=r;
	if(l==r){
	    c[k]=a[l];
	    return;
	}
	int mid=(l+r)/2;
	ls[k]=++stp;
	build(l,mid,stp);
	rs[k]=++stp;
	build(mid+1,r,stp);
	pushup(k);
}
void update(int l,int r,int x,int v,int k,int k0){
    lb[k]=l,rb[k]=r;
    if(l==r){
        c[k]=v;
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid){
        ls[k]=++stp;
        rs[k]=rs[k0];
        update(l,mid,x,v,stp,ls[k0]);
    } else {
        ls[k]=ls[k0];
        rs[k]=++stp;
        update(mid+1,r,x,v,stp,rs[k0]);
    }
    pushup(k);
}
int query(int x,int k){
    if(lb[k]==rb[k]) return c[k];
    int mid=(lb[k]+rb[k])/2;
    if(x<=mid) return query(x,ls[k]);
    else return query(x,rs[k]);
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	//stp=loc[0]=0;
	build(1,n,stp);
	for(int i=1;i<=m;i++){
	    int id,opt,x,v;
	    cin>>id>>opt;
	    if(opt==1){
	        loc[++tot]=++stp;
	        cin>>x>>v;
	        update(1,n,x,v,stp,loc[id]);
	    } else {
	        cin>>x;
	        tot++;
	        loc[tot]=loc[tot-1];
	        cout<<query(x,loc[id])<<endl;
	    }
	}
	return 0;
}

3AC 5WA 3TLE 1RE

2023/5/28 08:46
加载中...