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