记录编号 |
372757 |
评测结果 |
AAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
哒哒哒哒哒! |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.346 s |
提交时间 |
2017-02-19 06:23:58 |
内存使用 |
1.08 MiB |
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define ll long long
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
const ll maxn=101000;
ll c[maxn];
struct Node{
ll w,sum,lazy,sz;
Node *ch[2],*f;
Node(ll w=0,Node *f=0)
:w(w),f(f){ch[0]=ch[1]=0;lazy=0;sum=w;sz=1;}
bool rc(){if(f)return f->ch[1]==this;}
void add(ll x){sum+=sz*x,lazy+=x,w+=x;}
void down(){
if(!lazy) return;
if(ch[0]) ch[0]->add(lazy);
if(ch[1]) ch[1]->add(lazy);
lazy=0;
}
void up(){
sz=1,sum=w;
if(ch[0]) sz+=ch[0]->sz,sum+=ch[0]->sum;
if(ch[1]) sz+=ch[1]->sz,sum+=ch[1]->sum;
}
}*s;
void link(Node *x,Node *y,ll c){
if(x) x->f=y;
if(y) y->ch[c]=x;
}
void rot(Node *x){
Node *y=x->f;ll c=x->rc();
x->down();y->down();
link(x,y->f,y->rc());
link(x->ch[c^1],y,c);
link(y,x,c^1);y->up();x->up();
if(!x->f) s=x;
}
void splay(Node *x,Node *to=0){
for(Node *y=x;x->f!=to;rot(x))
if(y=x->f,y->f!=to)
x->rc()==y->rc()?rot(y):rot(x);
}
Node *build(ll l,ll r,Node *f=0){
if(l>r) return 0;
ll mid=(l+r)/2;
Node *x=new Node(c[mid],f);
x->ch[0]=build(l,mid-1,x);
x->ch[1]=build(mid+1,r,x);
x->up();return x;
}
Node *k_th(ll k,Node *to=0,Node *x=s){
ll sz=1;x->down();
if(x->ch[0]) sz+=x->ch[0]->sz;
if(k==sz) return splay(x,to),x;
return k_th(k-(k>sz?sz:0),to,x->ch[k>sz]);
}
int main(){
freopen("shuliec.in","r",stdin);freopen("shuliec.out","w",stdout);
ll n=read();
for(ll i=1;i<=n;i++) c[i]=read();
s=build(0,n+1);
ll m=read();char op[10];
for(ll i=1;i<=m;i++){
scanf("%s",op);
if(op[0]=='A'){
ll l=read(),r=read(),x=read();
k_th(l);k_th(r+2,s);
s->ch[1]->ch[0]->add(x);
}else{
ll l=read(),r=read();
k_th(l);k_th(r+2,s);
printf("%lld\n",s->ch[1]->ch[0]->sum);
}
}
fclose(stdin);fclose(stdout);
return 0;
}