记录编号 166223 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 0.236 s
提交时间 2015-06-14 16:26:56 内存使用 9.47 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>

#define MAXN 100000
#define READ

using namespace std;

int n,m;
char inp[20];
long long tree[6*MAXN];
long long add[6*MAXN];

void Clear(int ,int );
void Build(int ,int ,int );
void Update(int ,int ,long long  ,int ,int ,int );
long long Query(int ,int ,int ,int ,int );
inline int in();
inline long long qin();

int main(){
	#ifdef READ
		freopen("shuliec.in","r",stdin);
		freopen("shuliec.out","w",stdout);
	#endif
	int i;
	n=in();
	if(n==0)
		return 0;
	Build(1,n,1);
	m=in();
	for(i=1;i<=m;++i){
		scanf("%s",inp);
		if(inp[0]=='S'){
			int x,y;
			x=in();
			y=in();
			printf("%lld\n",Query(x,y,1,n,1));
		}
		if(inp[0]=='A'){
			int x,y;
			long long w;
			x=in();
			y=in();
			w=qin();
			Update(x,y,w,1,n,1);
		}
	}
} 

void Build(int l,int r,int rt){
	if(l==r){
		tree[rt]=qin();
		return ;
	}
	int mid=(l+r)>>1;
	int temp=rt<<1;
	Build(l,mid,temp);
	Build(mid+1,r,temp|1);
	tree[rt]=tree[temp]+tree[temp|1];
	return ;
}

void Clear(int rt,int len){
	if(add[rt]==0)
		return ;
	int temp=rt<<1;
	tree[temp]+=add[rt]*(len-(len>>1));
	tree[temp|1]+=add[rt]*(len>>1);
	add[temp]+=add[rt];
	add[temp|1]+=add[rt];
	add[rt]=0;
	return ;	
}

long long Query(int pos_l,int pos_r,int l,int r,int rt){
	if(pos_l<=l&&pos_r>=r)
		return tree[rt];
	Clear(rt,r-l+1);
	int mid=(l+r)>>1;
	int temp=rt<<1;
	long long Sum=0;
	if(pos_l<=mid)
		Sum=Query(pos_l,pos_r,l,mid,temp);
	if(pos_r>mid)
		Sum+=Query(pos_l,pos_r,mid+1,r,temp|1);
	tree[rt]=tree[temp]+tree[temp|1];	
	return Sum;		
}

void Update(int pos_l,int pos_r,long long new_date,int l,int r,int rt){
	if(pos_l<=l&&pos_r>=r){
		tree[rt]+=new_date*(r-l+1);
		add[rt]+=new_date;
		return ;
	}
	Clear(rt,r-l+1);
	int mid=(l+r)>>1;
	int temp=rt<<1;
	if(pos_l<=mid)
		Update(pos_l,pos_r,new_date,l,mid,temp);
	if(pos_r>mid)
		Update(pos_l,pos_r,new_date,mid+1,r,temp|1);
	tree[rt]=tree[temp]+tree[temp|1];
	return ;		
}

inline long long qin(){
	long long temp=0;char c=getchar();bool flag=0;
	while(c<'0'||c>'9'){
		if(c=='-'){
			flag=1;
		}
		c=getchar();
	}
	for(;c>='0'&&c<='9';c=getchar()){
		temp=temp*10+c-48;
	}
	if(flag) return -temp;
	return temp;
}

inline int in(){
	int temp=0;char c=getchar();bool flag=0;
	while(c<'0'||c>'9'){
		if(c=='-'){
			flag=1;
		}
		c=getchar();
	}
	for(;c>='0'&&c<='9';c=getchar()){
		temp=temp*10+c-48;
	}
	if(flag) return -temp;
	return temp;
}