记录编号 493522 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 GravatarCeres 是否通过 通过
代码语言 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;
}