记录编号 |
108896 |
评测结果 |
WWWWWWWWWW |
题目名称 |
数列操作C |
最终得分 |
0 |
用户昵称 |
digital-T |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
0.258 s |
提交时间 |
2014-07-06 20:40:14 |
内存使用 |
11.00 MiB |
显示代码纯文本
#include<algorithm>
#include<cstdio>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<fstream>
using namespace std;
//ifstream fi("shuliec.in");
//ofstream fo("shuliec.out");
long long n,m;
long long tot=0;
struct node
{
long long lc;
long long rc;
long long le;
long long ri;
long long sum;
long long ad;
}v[200002];
long long data[100002];
long long ss[100002];
long long delta,_sum=0;
void build(long long a,long long b)
{
tot++;
long long newv;
newv=tot;
v[newv].le=a;
v[newv].ri=b;
v[newv].ad=0;
if(a+1<=b)
{
long long mid;
mid=(a+b)>>1;
v[newv].lc=tot+1;
build(a,mid);
v[newv].rc=tot+1;
build(mid+1,b);
//v[newv].sum=v[v[newv].lc].sum+v[v[newv].rc].sum;
}
if(a==b)
{
v[newv].lc=-1;
v[newv].rc=-1;
// v[newv].sum=data[a]+v[newv].ad;
}
return;
}
void maintain(long long r)
{
v[r].sum=0;
if(v[r].lc!=-1&&v[r].rc!=-1)
{
v[r].sum=v[v[r].lc].sum+v[v[r].rc].sum;
}
v[r].sum+=v[r].ad*((long long)(v[r].ri-v[r].le+1));
}
void add(long long a,long long b,long long r)
{
if(a>v[r].ri||b<v[r].le||r==-1)
{
//v[r].sum+=v[r].ad*(v[r].ri-v[r].le+1);
return ;
}
if(a<=v[r].le&&b>=v[r].ri)
{
v[r].ad+=delta;
}
else
{
add(a,b,v[r].lc);
add(a,b,v[r].rc);
}
/*if(v[r].lc!=-1&&v[r].rc!=-1)
{
v[r].sum=v[v[r].lc].sum+v[v[r].rc].sum;
}
v[r].sum+=v[r].ad*(v[r].ri-v[r].le+1);*/
maintain(r);
}
void Sum(long long a,long long b,long long r,long long Ad)
{
if(a>v[r].ri||b<v[r].le||r==-1)
return ;
if(a<=v[r].le&&b>=v[r].ri)
{
_sum=_sum+v[r].sum+((long long)(v[r].ri-v[r].le+1))*Ad;
}
else
{
Sum(a,b,v[r].lc,Ad+v[r].ad);
Sum(a,b,v[r].rc,Ad+v[r].ad);
}
}
int main()
{
//ios::sync_with_stdio(false);
freopen("shuliec.in","r",stdin);
freopen("shuliec.out","w",stdout);
ss[0]=0;
scanf("%lld\n",&n);
//fi>>n;
for(long long i=1;i<=n;i++)
{
scanf("%lld",&data[i]);
//fi>>data[i];
ss[i]=ss[i-1]+data[i];
}
build(1,n);
scanf("%lld\n",&m);
//fi>>m;
string str;
for(long long i=1;i<=m;i++)
{
cin>>str;
//fi>>str;
if(str=="ADD")
{
long long a,b;
scanf(" %lld%lld%lld\n",&a,&b,&delta);
//fi>>a>>b>>delta;
add(a,b,1);
}
if(str=="SUM")
{
_sum=0;
long long a,b;
scanf(" %lld%lld\n",&a,&b);
//fi>>a>>b;
Sum(a,b,1,0);
_sum=_sum+ss[b]-ss[a-1];
printf("%lld\n",_sum);
//fo<<_sum<<endl;
}
}
return 0;
}