首页 > 代码库 > POJ 3468 区间加减 区间求和
POJ 3468 区间加减 区间求和
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 #define INF 0x7fffffff 8 #define maxn 101000 9 #define LL long long 10 using namespace std; 11 LL sum[maxn<<2]; 12 int add[maxn<<2],n,Q,u,v,w,m; 13 void pushup(int rt){ 14 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 15 } 16 void pushdown(int rt,int m){ 17 if(add[rt]){ 18 add[rt<<1]+=add[rt]; 19 add[rt<<1|1]+=add[rt]; 20 sum[rt<<1]+=(LL)add[rt]*(m-(m>>1)); 21 sum[rt<<1|1]+=(LL)add[rt]*(m>>1); 22 add[rt]=0; 23 } 24 } 25 void build(int l,int r,int rt){ 26 add[rt]=0; 27 if(l==r){ 28 scanf("%lld",&sum[rt]); 29 return; 30 } 31 int m=(l+r)>>1; 32 build(lson); 33 build(rson); 34 pushup(rt); 35 } 36 void update(int L,int R,int c,int l,int r,int rt){ 37 if(l>=L&&r<=R){ 38 add[rt]+=c; 39 sum[rt]+=(LL)c*(r-l+1); 40 return ; 41 } 42 pushdown(rt,r-l+1); 43 int m=(l+r)>>1; 44 if(L<=m)update(L,R,c,lson); 45 if(R>m)update(L,R,c,rson); 46 pushup(rt); 47 } 48 LL Query(int L,int R,int l,int r,int rt){ 49 if(l>=L&&r<=R){ 50 return sum[rt]; 51 } 52 pushdown(rt,r-l+1); 53 LL res=0; 54 int m=(l+r)>>1; 55 if(L<=m) res+=Query(L,R,lson); 56 if(R>m) res+=Query(L,R,rson); 57 return res; 58 } 59 int main(){ 60 cin>>n>>Q; 61 build(1,n,1); 62 char opt[20]; 63 for(int i=1;i<=Q;i++){ 64 cin>>opt; 65 if(opt[0]==‘C‘){ 66 scanf("%d%d%d",&u,&v,&w); 67 update(u,v,w,1,n,1); 68 } 69 else{ 70 scanf("%d%d",&u,&v); 71 cout<<Query(u,v,1,n,1)<<endl; 72 } 73 } 74 return 0; 75 }
POJ 3468 区间加减 区间求和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。