萌新求救,不知道哪里有问题 只用12分
查看原帖
萌新求救,不知道哪里有问题 只用12分
326066
玛法姆特楼主2020/10/19 00:42

RT

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i = a;i<=b;i++)
template<typename T = int>
inline T read(){
    register T r = 0,f = 1;
    register char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0'&& c<='9'){
        r = (r<<1)+(r<<3) - '0' + c;
        c = getchar();
    }
    return f*r;
}
typedef long long LL;

const int N = 1000000 + 5,M = 100010 ,INF = 0x3f3f3f3f;
int n,m;
int a[N];

int root[N],idx;
struct Node{
    int l,r;
    int val;
}tr[N * 20];

int build(int l,int r){
    int p = ++idx,mid = l +r >>1;
    if(l == r){
        tr[p].val = a[l];
        return p;
    }   
    tr[p].l = build(l,mid);
    tr[p].r = build(mid+1,r);
    return p;
}
int updata(int pre,int l,int r,int x,int v){
    int p = ++idx,mid = l + r >>1;
    tr[p] = tr[pre];
    if(l == r) {
        tr[p].val = v;
        return p;
    }
    if(x <= mid) tr[p].l =  updata(tr[pre].l,l,mid,x,v);
    else tr[p].r = updata(tr[pre].r,mid+1,r,x,v);
    return p;
}
int query(int pre,int l,int r,int x){
    if(l == r){
        return tr[pre].val;
    }
    int mid = l + r >>1;
    if(x <= mid) return query(tr[pre].l,l,mid,x);
    else return query(tr[pre].r,mid+1,r,x);
}
int main(){
    n = read();m = read();
    For(i,1,n) a[i] = read();
    root[0] = build(1,n); 
    For(i,1,m){
        int vv,ty,pos,val;
        vv = read(),ty = read();
        if(ty == 1){
            pos = read(),val = read();
            root[i] = updata(root[vv],1,n,pos,val);
        }
        else{
            pos = read();
            cout<<query(root[vv],1,n,pos)<<'\n';
        }
    }
    system("pause");
    return 0;
}
2020/10/19 00:42
加载中...