16pts求助,subtask2#两个点,其余全部RE、、、
查看原帖
16pts求助,subtask2#两个点,其余全部RE、、、
422992
Chaser2楼主2023/2/18 11:37
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define INF 0x3f3f3f3f
#define PII pair<int,int>
#define fi first
#define se second
#define pu push_back
#define po pop_back
#define endl '\n'

const int N = 1e6+5, mod = 1e9+7;

int n,m,q,k;
int a[N],root[N],idx;
int t[N*30],L[N*30],R[N*30];

int build(int l, int r){
    int u = ++idx;
    if(l==r){
        t[u]=a[l];
        return u;
    }
    int mid = (l+r)>>1;
    L[u]=build(1,mid),R[u]=build(mid+1,r);
    return u;
}

int change(int v, int l, int r, int x, int y){
    int u = ++idx;
    t[u]=t[v],L[u]=L[v],R[u]=R[v];
    if(l==r){
        t[u]=y;
        return u;
    }
    int mid = (l+r)>>1;
    if(mid>=x)L[u]=change(L[v],1,mid,x,y);
    else R[u]=change(R[v],mid+1,r,x,y);
    return u;
}

int query(int u, int l, int r, int x){
    if(l==r){
        return t[u];
    }
    int mid = (l+r)>>1;
    if(mid>=x)return query(L[u],1,mid,x);
    else return query(R[u],mid+1,r,x);
}

void solve(){
    cin>>n>>q;
    for(int i=1; i<=n; i++)cin>>a[i];
    root[0]=build(1,n);
    while(q--){
        int v,op,x,y;
        cin>>v>>op;
        if(op==1){
            cin>>x>>y;
            root[++m]=change(root[v],1,n,x,y);
        }
        else{
            cin>>x;
            cout<<query(root[v],1,n,x)<<endl;
            root[++m]=root[v];
        }
    }
}

int main(){
    ios::sync_with_stdio(false),cin.tie(0);
    int _=1;
    //cin>>_;
    while(_--){
        solve();
    }
    return 0;
}
2023/2/18 11:37
加载中...