记录编号 157313 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 0.322 s
提交时间 2015-04-08 16:15:04 内存使用 1.07 MiB
显示代码纯文本
/****************************************\
* Author : ztx
* Title  : [cogs] 1317. 数列操作c
* ALG    : 线段树复习 
* CMT    :
* Time   :
\****************************************/

#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
typedef long long ll ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}
template <typename TP>inline void reads(TP& ret) {
	while (ret=getchar() , ret<'!') ;
	while (CH=getchar() , CH>'!') ;
}

#define  maxn  100010LL

struct node {
	ll v , lazy ; node *l,*r ;
	void init() {v=lazy=0;l=r=NULL;}
	void update() {v=l->v+r->v;}
} *root ;

ll a[maxn] = {0} ;
inline void Build(node*& o,int L,int R) {
	o = new node ; o->init() ;
	if (L == R) { o->v = a[L] ; return ; }
	int M = (L+R)>>1 ;
	Build(o->l,L,M) ;
	Build(o->r,M+1,R) ;
	o->update() ;
}

int ql,qr;
ll qw,ans;
inline void Clear(node* o,int L,int R) {
	if (L==R) { o->lazy=0;return; }
	int M = (L+R)>>1 ;
	o->l->lazy += o->lazy ;
	o->r->lazy += o->lazy ;
	o->l->v += o->lazy*(M-L+1) ;
	o->r->v += o->lazy*(R-M) ;
	o->lazy = 0 ;/*!!*/ 
}
inline void Add(node* o,int L,int R) {
	if (ql<=L && R<=qr) {
		o->v += (R-L+1)*qw ; o->lazy += qw ; return ;
	}
	if (L == R) return ;
	Clear(o,L,R) ;
	int M = (L+R)>>1 ;
	if (ql<=M) Add(o->l,L,M) ;
	if (M<qr) Add(o->r,M+1,R) ;
	o->update() ;
}
inline void Sum(node* o,int L,int R) {
	Clear(o,L,R) ;
	if (ql<=L && R<=qr) { ans += o->v ; return ; }
	if (L == R) return ;
	int M = (L+R)>>1 ;
	if (ql<=M) Sum(o->l,L,M) ;
	if (M<qr) Sum(o->r,M+1,R) ;
	o->update();
}

int main() {
int n , m , i , cmd ;
	#define READ
	#ifdef  READ
		freopen("shuliec.in" ,"r",stdin ) ;
		freopen("shuliec.out","w",stdout) ;
	#endif
	read(n) ;
	Rep (i,1,n) read(a[i]) ;
	Build(root,1,n) ;
	read(m) ;
	while (m --> 0) {
		reads(cmd) ;
		read(ql) , read(qr) ;
		if (cmd == 'S') {
			ans = 0 ;
			Sum(root,1,n) ;
			printf("%lld\n", ans) ;
		} else {
			read(qw) ;
			Add(root,1,n) ;
		}
	}
	#ifdef  READ
		fclose(stdin) ; fclose(stdout) ;
	#else
		getchar() ; getchar() ;
	#endif
	return 0 ;
}