记录编号 |
298776 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
数列操作B |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.506 s |
提交时间 |
2016-08-22 19:32:51 |
内存使用 |
2.20 MiB |
显示代码纯文本
#include<cstdio>
const int N=100010;
int son[N][2],fa[N],key[N],Add[N],n,m;
void pushdown(int x){
key[x]+=Add[x];
if (son[x][0]!=n+1) Add[son[x][0]]+=Add[x];
if (son[x][1]!=n+1) Add[son[x][1]]+=Add[x];
Add[x]=0;
}
bool getc(int x){
return x==son[fa[x]][1];
}
void rotate(int x){//将x旋转至其父节点
int y=fa[x];
bool b=getc(x);
pushdown(y);
pushdown(x);
fa[x]=fa[y];
if (fa[x]!=-1) son[fa[x]][getc(y)]=x;
fa[son[y][b]=son[x][!b]]=y;
fa[son[x][!b]=y]=x;
}
void splay(int x){
pushdown(x);
while (fa[x]!=-1) rotate(x);
}
int getnum(int x){
splay(x);
return key[x];
}
void add(int l,int r,int a){
splay(l-1);
splay(r+1);
Add[son[son[r+1][0]][1]]+=a;
}
int main()
{
freopen("shulieb.in","r",stdin);
freopen("shulieb.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&key[i]);
for (int i=0;i<=n+1;i++)
son[i][0]=son[i][1]=n+2;
for (int i=n;i>=0;i--){
son[i][1]=i+1;
fa[i+1]=i;
}
fa[0]=-1;
scanf("%d",&m);
char s[10];int x,y,z;
while (m--){
scanf("%s%d",s,&x);
if (s[0]=='A'){
scanf("%d%d",&y,&z);
add(x,y,z);
}
else printf("%d\n",getnum(x));
}
return 0;
}