记录编号 |
146967 |
评测结果 |
AAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
ok |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.712 s |
提交时间 |
2015-01-21 21:49:44 |
内存使用 |
7.18 MiB |
显示代码纯文本
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
class tree
{
public:
int l,r,L,R;
long long s,lazy;
} a[200002];
long long d[100001],n,m,tot=1;
long long maketree(int ll,int rr)
{
int mid=(ll+rr)/2,root=tot;
a[root].l=ll;
a[root].r=rr;
a[root].lazy=0;
if(ll<rr)
{
a[root].L=++tot;
maketree(ll,mid);
a[root].R=++tot;
maketree(mid+1,rr);
a[root].s=a[a[root].L].s+a[a[root].R].s;
}
else
{
a[root].L=0;
a[root].R=0;
a[root].s=d[ll];
}
return 0;
}
long long add(int root,int ll,int rr,long long z,long long zzz)
{
if(root==-1) return 0;
if(ll>a[root].r||rr<a[root].l)
{
a[root].s+=zzz*(a[root].r-a[root].l+1);
a[root].lazy+=zzz;
return 0;
}
if(ll<=a[root].l&&rr>=a[root].r)
{
a[root].lazy+=z+zzz;
a[root].s+=(z+zzz)*(a[root].r-a[root].l+1);
return 0;
}
else
{
add(a[root].L,ll,rr,z,zzz+a[root].lazy);
add(a[root].R,ll,rr,z,zzz+a[root].lazy);
a[root].lazy=0;
if(a[root].L!=-1)
{
a[root].s=a[a[root].L].s+a[a[root].R].s;
}
}
return 0;
}
long long sum(int root,int ll,int rr,long long zzz)
{
if(root==-1) return 0;
if(ll>a[root].r||rr<a[root].l) return 0;
if(ll<=a[root].l&&rr>=a[root].r)
{
return a[root].s+zzz*(a[root].r-a[root].l+1);
}
return sum(a[root].L,ll,rr,zzz+a[root].lazy)+sum(a[root].R,ll,rr,zzz+a[root].lazy);
}
int main()
{
long long i,aaa,bbb,ccc;
string mmm;
freopen ("shuliec.in","r",stdin);
freopen ("shuliec.out","w",stdout);
cin>>n;
for(i=1;i<=n;i++) cin>>d[i];
maketree(1,n);
cin>>m;
for(i=1;i<=m;i++)
{
cin>>mmm;
if(mmm[0]=='A')
{
cin>>aaa>>bbb>>ccc;
add(1,aaa,bbb,ccc,0);
}
else
{
cin>>aaa>>bbb;
cout<<sum(1,aaa,bbb,0)<<endl;
}
}
return 0;
}