记录编号 406747 评测结果 AAAAAAAAAAAAAAA
题目名称 数列操作B 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 4.135 s
提交时间 2017-05-19 20:39:44 内存使用 14.04 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct stree
{
  int l,r;
  int ls,rs;
  int sum,lazy;
  stree(){l=0,r=0,ls=-1,rs=-1,sum=0,lazy=0;}
};
int n,m,maxn;
int N[100001];
char oprt[10];
vector<stree> tree;
int build(int l,int r)
{
  stree temp;
  int now=maxn++;
  tree.push_back(temp);
  tree[now].l=l;tree[now].r=r;
  if(l==r)
    {
      tree[now].sum=N[l];
      return now;
    }
  int ls,rs,mid=(l+r)>>1;
  ls=build(l,mid);
  rs=build(mid+1,r);
  tree[now].ls=ls;tree[now].rs=rs;
  return now;
}
inline void update(int now,int num)
{
  if(tree[now].l==tree[now].r)
    {
      tree[now].sum+=num;
      tree[now].lazy=0;
      return;
    }
  tree[tree[now].ls].lazy+=num;
  tree[tree[now].rs].lazy+=num;
  tree[now].lazy=0;
}
void add(int l,int r,int num,int now)
{
  if(tree[now].lazy!=0)update(now,tree[now].lazy);
  if(tree[now].l==l&&tree[now].r==r)
    {
      tree[now].lazy+=num;
      return;
    }
  int mid=tree[tree[now].ls].r;
  if(r<=mid)add(l,r,num,tree[now].ls);
  else if(l>mid)add(l,r,num,tree[now].rs);
  else
    {
      add(l,mid,num,tree[now].ls);
      add(mid+1,r,num,tree[now].rs);
    }
}
int Q(int now,int s)
{
  if(tree[now].lazy!=0)update(now,tree[now].lazy);
  if(tree[now].l==tree[now].r)return tree[now].sum;
  int mid=tree[tree[now].ls].r;
  if(s<=mid)return Q(tree[now].ls,s);
  else return Q(tree[now].rs,s);
}
int main()
{
  freopen("shulieb.in","r",stdin);
  freopen("shulieb.out","w",stdout);
  scanf("%d",&n);
  for(int i=1;i<=n;i++)scanf("%d",&N[i]);
  build(1,n);
  scanf("%d",&m);
  for(int i=1;i<=m;i++)
    {
      cin>>oprt;
      if(oprt[0]=='A')
	{
	  int a,b,c;
	  scanf("%d%d%d",&a,&b,&c);
	  add(a,b,c,0);
	}
      else
	{
	  int s;
	  scanf("%d",&s);
	  printf("%d\n",Q(0,s));
	}
    }
  return 0;
}