记录编号 302724 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar沉迷学习的假的Keller 是否通过 通过
代码语言 C++ 运行时间 0.373 s
提交时间 2016-09-04 16:25:28 内存使用 6.39 MiB
显示代码纯文本
#include<cstdio>
#define lch(x) x<<1
#define rch(x) x<<1|1
long long st[400050],lazy[400050];
int read(){
	int x;char ch;bool minus=false;
	while(ch=getchar(),(ch>'9'||ch<'0')&&ch!='-');
	if(ch=='-'){
		ch=getchar();minus=true;
	}
	x=ch-48;
	while(ch=getchar(),ch>='0'&&ch<='9')x=x*10+ch-48;
	return minus?-x:x;
}
void build(int rt,int l,int r){
	if(l==r)st[rt]=read();
	else{
		int mid=(l+r)>>1;
		build(lch(rt),l,mid);
		build(rch(rt),mid+1,r);
		st[rt]=st[lch(rt)]+st[rch(rt)];
	}
}
char getstr(){
	char ch;
	while(ch=getchar(),ch>'Z'||ch<'A');
	getchar();getchar();
	return ch;
}
void update(int rt,int l,int r){
	int mid=(l+r)>>1;
	lazy[lch(rt)]+=lazy[rt];st[lch(rt)]+=lazy[rt]*(mid+1-l);
	lazy[rch(rt)]+=lazy[rt];st[rch(rt)]+=lazy[rt]*(r-mid);
	lazy[rt]=0;
}
long long query(int rt,int l,int r,int a,int b){
	if(a<=l&&r<=b)return st[rt];
	int mid=(l+r)>>1;
	update(rt,l,r);
	if(b<=mid)return query(lch(rt),l,mid,a,b);
	if(a>mid)return query(rch(rt),mid+1,r,a,b);
	return query(lch(rt),l,mid,a,b)+query(rch(rt),mid+1,r,a,b);
}
void insert(int rt,int l,int r,int a,int b,int w){
	if(a<=l&&r<=b){
		lazy[rt]+=w;
		st[rt]+=w*(r-l+1);
		return;
	}
	update(rt,l,r);
	int mid=(l+r)>>1;
	if(a<=mid)insert(lch(rt),l,mid,a,b,w);
	if(b>mid)insert(rch(rt),mid+1,r,a,b,w);
	st[rt]=st[lch(rt)]+st[rch(rt)];	
}
int main(){
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	int n=read();
	build(1,1,n);
	int m=read();
	int x,y,z;
	while(m--){
		if(getstr()=='S'){
			x=read();y=read();
			printf("%lld\n",query(1,1,n,x,y));
		}else{
			x=read();y=read();z=read();
			insert(1,1,n,x,y,z);
		}
	}
	fclose(stdin);fclose(stdout);
	return 0;
}