POJ 3468 A Simple Problem with Integers 区间和更新,区间和查找

点击打开链接

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#define LL long long
#define bug puts("***********");
#define lson L,mid,ind<<1
#define rson mid+1,R,ind<<1|1
#define lind ind<<1
#define rind ind<<1|1
using namespace std;
const int N=100010;
LL sum[N*4];
LL lazy[N*4];
int n,m;
void pushdown(int ind,int L,int R){
    if(lazy[ind]!=0){                         ///向下更新,孩子lazy需要更新,孩子的区间和也需要更新
        lazy[rind]+=lazy[ind];
        lazy[lind]+=lazy[ind];
        sum[lind]+=lazy[ind]*((R+L)/2-L+1);
        sum[rind]+=lazy[ind]*(R-(R+L)/2);
        lazy[ind]=0;
    }
}
void pushup(int ind){
    sum[ind]=sum[lind]+sum[rind];
}
void build(int L,int R,int ind){
    if(L==R){
        scanf("%lld",&sum[ind]);
        return ;
    }
    int mid=L+(R-L)/2;
    build(lson);
    build(rson);
    pushup(ind);
}
void update(int sl,int sr,int val,int L,int R,int ind){
    if(sl<=L&&sr>=R){
        lazy[ind]+=val;
        sum[ind]+=val*(R-L+1);
        return ;
    }
    if(sl>R||sr<L) return ;
    pushdown(ind,L,R);
      int mid=L+(R-L)/2;
      update(sl,sr,val,lson);
      update(sl,sr,val,rson);
      pushup(ind);
}
LL Query(int sl,int sr,int L,int R,int ind){
    LL msum=0;
    if(sl<=L&&sr>=R){
        return sum[ind];
    }
    if(sl>R||sr<L) return 0;
    pushdown(ind,L,R);
  //  pushup(ind);
    int mid=L+(R-L)/2;
    msum+=Query(sl,sr,lson);
    msum+=Query(sl,sr,rson);
    return msum;
}
int u,v,d;
int main(){
    memset(sum,0,sizeof(sum));
    memset(lazy,0,sizeof(lazy));
    scanf("%d%d",&n,&m);
    build(1,n,1);
    char s[10];
    while(m--){
        scanf("%s",s);
        if(s[0]=='Q'){
            scanf("%d%d",&u,&v);
            printf("%lld\n",Query(u,v,1,n,1));
        }
        else{
            scanf("%d%d%d",&u,&v,&d);
            update(u,v,d,1,n,1);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值