POJ 3468 A Simple Problem with Integers
题目链接:http://poj.org/problem?id=3468
存模板
#include<stdio.h>
#define int64 __int64
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=200000;
struct node
{
int64 l,r,laz;
int64 sum;
int64 mid()
{
return (l+r)/2;
}
};
struct node tree[maxn<<2];
void build(int64 l,int64 r,int64 rt)
{
tree[rt].l=l;
tree[rt].r=r;
tree[rt].laz=0;
if(tree[rt].l==tree[rt].r)
{
scanf("%I64d",&tree[rt].sum);
return ;
}
int64 m=tree[rt].mid();
build(lson);
build(rson);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void PushDown(int64 rt,int64 m)
{
if(tree[rt].laz)
{
tree[rt<<1].laz+=tree[rt].laz;
tree[rt<<1|1].laz+=tree[rt].laz;
tree[rt<<1].sum+=(m-(m>>1))*tree[rt].laz;
tree[rt<<1|1].sum+=(m>>1)*tree[rt].laz;
tree[rt].laz=0;
}
}
void updata(int64 L,int64 R,int64 add,int64 rt)
{
if(L<=tree[rt].l && tree[rt].r<=R)
{
tree[rt].laz+=add;
tree[rt].sum+=(tree[rt].r-tree[rt].l+1)*add;
return ;
}
int64 m=tree[rt].mid();
PushDown(rt,tree[rt].r-tree[rt].l+1);
if(R<=m)
updata(L,R,add,rt<<1);
else if(L>m)
updata(L,R,add,rt<<1|1);
else
{
updata(L,R,add,rt<<1);
updata(L,R,add,rt<<1|1);
}
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
int64 query(int64 L,int64 R,int64 rt)
{
if(L<=tree[rt].l && tree[rt].r<=R)
{
return tree[rt].sum;
}
int64 m=tree[rt].mid();
PushDown(rt,tree[rt].r-tree[rt].l+1);
int64 ret=0;
if(R<=m)
ret+=query(L,R,rt<<1);
else if(L>m)
ret+=query(L,R,rt<<1|1);
else
{
ret+=query(L,R,rt<<1);
ret+=query(L,R,rt<<1|1);
}
return ret;
}
int main()
{
int64 a,b,c;
char op[10];
int64 n,m;
while(scanf("%I64d %I64d",&n,&m)!=EOF)
{
build(1,n,1);
while(m--)
{
scanf("%s",op);
if(op[0]=='Q')
{
scanf("%I64d %I64d",&a,&b);
printf("%I64d\n",query(a,b,1));
}
else
{
scanf("%I64d %I64d %I64d",&a,&b,&c);
updata(a,b,c,1);
}
}
}
return 0;
}