| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
必须要用lazy思想否则超时自己看着办!#include <iostream>
#include <cstdio>
#include <cstdlib>
#define M 100010
using namespace std;
__int64 map[M];
int m,n;
__int64 ans;
struct TREE
{
int l,r;//左节点,右节点
__int64 p,sum;//公共增量,区间和
}T[M<<2];
void create(int u,int l,int r)
{
T[u].l=l;T[u].r=r;T[u].p=0;
if(l==r)
{
T[u].sum=map[l];
return;
}
int mid=(T[u].l+T[u].r)>>1;
create(u<<1,l,mid);
create(u<<1|1,mid+1,r);
T[u].sum=T[u<<1].sum+T[u<<1|1].sum;
}
void updata(int u,int l,int r,__int64 c)
{
if(T[u].l==l&&T[u].r==r)
{
T[u].p+=c;
return;
}
T[u].sum+=(r-l+1)*c;
int mid=(T[u].l+T[u].r)>>1;
if(r<=mid)
updata(u<<1,l,r,c);
else if(l>=mid+1)
updata(u<<1|1,l,r,c);
else
{
updata(u<<1,l,mid,c);
updata(u<<1|1,mid+1,r,c);
}
}
__int64 query(int u,int l,int r)
{
__int64 del=T[u].p;
if(T[u].l==l&&T[u].r==r)
return(T[u].sum+del*(r-l+1));
else
{
T[u<<1].p+=T[u].p;
T[u<<1|1].p+=T[u].p;
T[u].sum+=del*(T[u].r-T[u].l+1);
T[u].p=0;
}
int mid=(T[u].l+T[u].r)>>1;
if(r<=mid)
return(query(u<<1,l,r));
else if(l>=mid+1)
return(query(u<<1|1,l,r));
else
return(query(u<<1,l,mid)+query(u<<1|1,mid+1,r));
}
int main()
{
char a[7];int b,c;__int64 d;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%I64d",&map[i]);
create(1,1,n);
while(m--)
{
scanf("%s",a);
if(a[0]=='C')
{
scanf("%d%d%I64d",&b,&c,&d);
updata(1,b,c,d);
}
else
{
scanf("%d%d",&b,&c);
ans=0;
ans=query(1,b,c);
printf("%I64d\n",ans);
}
}
}
system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator