您的位置:首页 > 其它

POJ 3468 A Simple Problem with Integers

2014-09-26 20:20 169 查看
区间更新区间求和。

题目:http://poj.org/problem?id=3468

#include <stdio.h>
#include <iostream>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;
typedef long long ll;
const int maxn = 100005;
ll tree[maxn<<2];
ll flag[maxn<<2];

void PushUp(int rt) {
tree[rt] = tree[rt<<1] + tree[rt<<1|1];
}
void PushDown(int rt,int m){
if(flag[rt]){
flag[rt<<1] += flag[rt];
flag[rt<<1|1] += flag[rt];
tree[rt<<1] += (m - (m>>1))*flag[rt];
tree[rt<<1|1] += (m>>1)*flag[rt];
flag[rt] = 0;
}
}
void build(int l,int r,int rt){
if(l == r){
scanf("%lld",tree+rt);
return;
}
int m =(l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
}
void update(int L,int R,int p,int l,int r,int rt){
if(L <= l && r <= R){
flag[rt] += p;
tree[rt] += (ll)p*(r-l+1);
return;
}
PushDown(rt, r-l+1);
int m = (l+r)>>1;
if(L <= m)
update(L, R, p, lson);
if(R > m)
update(L, R, p, rson);
PushUp(rt);
}
ll query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R)
return tree[rt];
ll res = 0;
PushDown(rt, r-l+1);
int m = (l+r)>>1;
if(L <= m)
res += query(L, R, lson);
if(R > m)
res += query(L, R, rson);
return res;
}
int main(){
int n,q;
while(~scanf("%d%d",&n,&q)){
build(1, n, 1);
while(q--){
char ch[2];
int x,y,z;
scanf("%s",ch);
if(ch[0] == 'Q'){
scanf("%d%d",&x,&y);
printf("%lld\n",query(x, y, 1, n, 1));
}
else{
scanf("%d%d%d",&x,&y,&z);
update(x, y, z, 1,n,1);
}
//            for(int i = 1;i < n*4;i++)
//                printf("%lld ",tree[i]);
//            printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: