64pts,求调
查看原帖
64pts,求调
595697
Papy楼主2024/5/5 16:11

WA的都是输出0的qwq

#include <iostream>
#include <cstdio>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 1e6+5;
const int maxm = 1e6+5;
int n, m;
int a[maxn], rt[maxm];
int ver = -1;

template<typename type>
void inline read(type &x){
    x = 0; type f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9'){
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
        x = x*10+ch-'0', ch = getchar();
    x = x*f;
}

struct node{
    int l, r, sum;
    int lson, rson;
}tree[maxn*40];
int cntnode = 0;

int clone(int id){
    tree[++cntnode] = tree[id];
    return cntnode;
}

void pushup(int id){
    tree[id].sum = tree[tree[id].lson].sum + tree[tree[id].rson].sum;
}

void buildTree(int &id, int l, int r){
    id = ++cntnode;
    tree[id].l = l;
    tree[id].r = r;
    if (l == r){
        tree[id].sum = a[l];
        return;
    }

    int mid = (l+r)>>1;
    buildTree(tree[id].lson, l, mid);
    buildTree(tree[id].rson, mid+1, r);
    pushup(id);
}

int change(int id, int x, int d){
    int cloneid = clone(id);
    int tl = tree[id].l;
    int tr = tree[id].r;
    if (tl == tr){
        tree[cloneid].sum = d;

        return cloneid;
    }
    int mid = (tl+tr)>>1;
    if (x <= mid){
        tree[cloneid].lson = change(tree[id].lson, x, d);
    }else{
        tree[cloneid].rson = change(tree[id].rson, x, d);
    }
    pushup(cloneid);
    return cloneid;
}

int query(int id, int x){
    int tl = tree[id].l;
    int tr = tree[id].r;
    if (tl == tr && tl == x){
        return tree[id].sum;
    }
    int mid = (tl+tr)>>1;
    if (x <= mid)
        return query(tree[id].lson, x);
    else if (x > mid)
        return query(tree[id].rson, x);
}

int main(){
    read(n); read(m);
    for (int i = 1; i <= n; i++){
        read(a[i]);
    }
    buildTree(rt[++ver], 1, n);
    for (int i = 1; i <= m; i++){
        int v, opt, loc, val;
        read(v); read(opt);

        if (opt == 1){
            read(loc); read(val);
            rt[++ver] = change(rt[v], loc, val);
        }else if (opt == 2){
            read(loc);
            printf("%d\n", query(rt[v], loc));
            rt[++ver] = change(rt[v], 1, 0);
        }
    }


    return 0;
}
2024/5/5 16:11
加载中...