您的位置:首页 > 其它

POJ 3468 A Simple Problem with Integers

2018-03-28 10:59 344 查看
HDU 3468
#include<cstdio>
using namespace std;
long long tree[400010],lazy[400010];
long long build(int node,int l,int r){
if(l==r)scanf("%lld",&tree[node]);
else{
int mid=(l+r)/2;
tree[node]=build(node*2,l,mid)+build(node*2+1,mid+1,r);
}
return tree[node];
}
void add(int node,int L,int R,int l,int r,long long ad){
if(L>=l&&R<=r){
tree[node]+=(long long)(R-L+1)*ad;
lazy[node]+=ad;
return;
}
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)add(node*2,L,mid,l,r,ad);
else if(mid<l)add(node*2+1,mid+1,R,l,r,ad);
else{
add(node*2,L,mid,l,r,ad);
add(node*2+1,mid+1,R,l,r,ad);
}
tree[node]=tree[node*2]+tree[node*2+1];
}
long long query(int node,int L,int R,int l,int r){
if(L>=l&&R<=r)return tree[node];
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)return query(node*2,L,mid,l,r);
else if(mid<l)return query(node*2+1,mid+1,R,l,r);
return query(node*2,L,mid,l,r)+query(node*2+1,mid+1,R,l,r);
}
int main(){
long long z;
int n,q,i,x,y;
char c;
scanf("%d%d",&n,&q);
build(1,1,n);
for(i=1;i<=q;i++){
scanf("\n%c %d%d",&c,&x,&y);
if(c=='C'){
scanf("%lld",&z);
add(1,1,n,x,y,z);
}
else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: