求助!!
查看原帖
求助!!
789383
ouzhou楼主2022/12/18 18:46
#include <iostream>
#define MAX 100000
using namespace std;

class tree{
public:
    //定义树节点;
    struct node{
        int l , r , sum , tag = 0;
    };
    vector<int> box;
    node nodes[MAX];
    int build(int i , int l , int r){
        nodes[i].r = r, nodes[i].l = l;
        if(l == r){
            nodes[i].sum = box[l];
            nodes[i].tag = box[l];
            return nodes[i].sum;
        }
        int mid = (r+l)>>1;
        return nodes[i].sum = build(2*i,l,mid) + build(2*i+1,mid+1,r);
    }
    tree(int size){
        while(size--){
            int a = 0;
            cin >> a;
            box.push_back(a);
        }
        int length = int(box.size());
        build(1,0,length-1);
    }
    void modify(int l , int r , int k , int i){
        if(nodes[i].r <= r && nodes[i].l >= l){
            nodes[i].tag += k;
            return;
        }
        int mid = (nodes[i].r + nodes[i].l)>>1;
        if(l <= mid){
            modify(l , r , k , 2*i);
        }
        if(mid < r){
            modify(l , r , k , 2*i+1);
        }

    }
    void add(){
        int a , b , c;
        cin >> a >> b >> c;
        modify(a,b,c,1);
    }

    int query(int p , int x){
        if(nodes[p].r == nodes[p].l){
            return nodes[p].tag;
        }
        int mid = (nodes[p].r + nodes[p].l)>>1;
        return x <= mid ? nodes[p].tag + query(2*p, x) : nodes[p].tag + query(2*p+1,x);
    }
    int query_pro(){
        int target = 0;
        cin >> target;
        return query(1,target-1);
    }
};

int main(){
    int size , operations;
    cin >> size >> operations;
    tree op(size);
    while(operations--){
        int select = 0;
        cin >> select;
        if(select == 1){op.add();}
        else{cout << op.query_pro() << endl;}
    }
}
2022/12/18 18:46
加载中...