记录编号 |
493522 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
Ceres |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
9.361 s |
提交时间 |
2018-04-02 21:50:55 |
内存使用 |
6.46 MiB |
显示代码纯文本
#include <fstream>
#include <string>
using namespace std;
ifstream cin("shuliec.in");
ofstream cout("shuliec.out");
int n,m;
long long num[100001];
long long seg[400001];
int s,t;
long long d;
long long lazy_mark[400001];
void build_seg(int root,int l,int r)
{
if(l==r)
{
seg[root]=num[l];
return;
}
int mid;
mid=(l+r)/2;
build_seg(root*2,l,mid);
build_seg(root*2+1,mid+1,r);
seg[root]=seg[root*2]+seg[root*2+1];
}
long long sum(int root,int l,int r)
{
if(l>t||r<s)
{
return 0;
}
if(s<=l&&t>=r)
{
return seg[root];
}
int mid=(l+r)/2;
lazy_mark[root*2]+=lazy_mark[root];
lazy_mark[root*2+1]+=lazy_mark[root];
seg[root*2]+=(mid-l+1)*lazy_mark[root];
seg[root*2+1]+=(r-mid)*lazy_mark[root];
lazy_mark[root]=0;
long long ret=0;
ret+=sum(root*2,l,mid);
ret+=sum(root*2+1,mid+1,r);
seg[root]=seg[root*2]+seg[root*2+1];
return ret;
}
void add(int root,int l,int r)
{
if(l>t||r<s)
{
return;
}
if(s<=l&&t>=r)
{
seg[root]+=(r-l+1)*d;
lazy_mark[root]+=d;
return;
}
int mid=(l+r)/2;
lazy_mark[root*2]+=lazy_mark[root];
lazy_mark[root*2+1]+=lazy_mark[root];
seg[root*2]+=(mid-l+1)*lazy_mark[root];
seg[root*2+1]+=(r-mid)*lazy_mark[root];
lazy_mark[root]=0;
add(root*2,l,mid);
add(root*2+1,mid+1,r);
seg[root]=seg[root*2]+seg[root*2+1];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
build_seg(1,1,n);
cin>>m;
for(int i=1;i<=m;i++)
{
string oper;
cin>>oper>>s>>t;
if(oper=="SUM")
{
cout<<sum(1,1,n)<<endl;
}
if(oper=="ADD")
{
cin>>d;
add(1,1,n);
}
}
cin.close();
cout.close();
return 0;
}