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