P3374 【模板】树状数组 1(线段树)

 

const int limit=5e5;
const int N=5e5+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
struct node
{
    int l,r;
    int sum;
}tree[N<<2];
void build(int l,int r,int id)
{
    tree[id].l=l,tree[id].r=r;
    if(l==r) tree[id].sum=a[l];
    else{
        int mid=l+r>>1;
        build(l,mid,id<<1);
        build(mid+1,r,id<<1|1);
        tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;
    }
}
int query(int l,int r,int id)
{
    if(l<=tree[id].l && r>=tree[id].r) return tree[id].sum;
    if(l>tree[id].r || r<tree[id].l) return 0;

    int sum=0;
    if(tree[id<<1].r>=l) sum+=query(l,r,id<<1);
    if(tree[id<<1|1].l<=r) sum+=query(l,r,id<<1|1);
    return sum;
}
void update(int pos,int val,int id)
{
    if(tree[id].l==tree[id].r){ tree[id].sum+=val; return ; }

    if(tree[id<<1].r>=pos) update(pos,val,id<<1);
    else update(pos,val,id<<1|1);
    tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;
}
int main()
{
    //IOS;
    while(sdd(n,m)==2){
        for(i=1;i<=n;i++) sd(a[i]);
        build(1,limit,1);
        for(i=1;i<=m;i++){
            int tag,x,y;
            sddd(tag,x,y);
            if(tag==1){
                update(x,y,1);
            }
            else{
                pd(query(x,y,1));
            }
        }
    }
    return 0;
    //PAUSE;
}

 

 

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107753918