记录编号 160004 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.359 s
提交时间 2015-04-23 16:52:56 内存使用 42.28 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
 
using namespace std;
 
void file(){
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
}
 
#define N 1000010
#define LL long long
 
struct node{
	node *ch[2];
	int sum;
	LL v,add,sumv;
	int cmp(int x){
		if(x==ch[0]->sum+1) return -1;
		return x>ch[0]->sum+1;
	}
	node* init(LL x);
	void push();
	void update(){
		sum=ch[0]->sum+ch[1]->sum+1;
		sumv=ch[0]->sumv+ch[1]->sumv+v;
	}
}spT[N],*root,Null;
 
int n,tot,m;
LL a[N];
 
void node::push(){
	if(this==&Null) return;
	if(ch[0]!=&Null){
		ch[0]->add+=add;
		ch[0]->v+=add;
		ch[0]->sumv+=ch[0]->sum*add;
	}
	if(ch[1]!=&Null){
		ch[1]->add+=add;
		ch[1]->v+=add;
		ch[1]->sumv+=ch[1]->sum*add;
	}
	add=0;
}
 
void rot(node* &o,int x){
	node *tmp=o->ch[x];
	tmp->push();
	o->ch[x]=tmp->ch[x^1];
	tmp->ch[x^1]=o;
	o->update(); o=tmp;
	o->update();
}
 
node* node::init(LL x){
	sumv=x; sum=1;
	ch[0]=ch[1]=&Null;
	v=x; add=0;
	return this;
}
 
void splay(node* &o,int k){
	o->push();
	int t=o->cmp(k);
	if(t==-1) return;
	if(t) k-=o->ch[0]->sum+1;
	o->ch[t]->push();
	int t1=o->ch[t]->cmp(k);
	if(~t1){
		if(t1) k-=o->ch[t]->ch[0]->sum+1;
		splay(o->ch[t]->ch[t1],k);
		if(t1==t) rot(o,t);
		else rot(o->ch[t],t1);
	}
	rot(o,t);
}
 
node* build(LL src[],int l,int r){
	if(l==r) return spT[++tot].init(src[l]);
	int mid=(l+r)>>1;
	node* tmp=spT[++tot].init(src[mid]);
	if(mid-1>=l) tmp->ch[0]=build(src,l,mid-1);
	if(mid+1<=r) tmp->ch[1]=build(src,mid+1,r);
	tmp->update();
	return tmp;
}
 
void addin(int l,int r,int v){
	int len=r-l+1;
	splay(root,l); splay(root->ch[1],len+1);
	node* tmp=root->ch[1]->ch[0];
	tmp->add+=v; tmp->sumv+=tmp->sum*v;
	tmp->v+=v;
}
 
LL qsum(int l,int r){
	int len=r-l+1;
	splay(root,l);
	splay(root->ch[1],len+1);
	node* tmp=root->ch[1]->ch[0];
	return tmp->sumv;
}
 
int main(){
	file();
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	root=build(a,0,n+1);
	scanf("%d",&m);
	char cmd[11];
	int l,r;
	LL v;
	for(int i=1;i<=m;i++){
		scanf("%s%d%d",cmd,&l,&r);
		if(l>r) swap(l,r);
		if(cmd[0]=='S') printf("%lld\n",qsum(l,r));
		else{
			scanf("%lld",&v);
			addin(l,r,v);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}