记录编号 406747 评测结果 AAAAAAAAAAAAAAA
题目名称 数列操作B 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 4.135 s
提交时间 2017-05-19 20:39:44 内存使用 14.04 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. struct stree
  7. {
  8. int l,r;
  9. int ls,rs;
  10. int sum,lazy;
  11. stree(){l=0,r=0,ls=-1,rs=-1,sum=0,lazy=0;}
  12. };
  13. int n,m,maxn;
  14. int N[100001];
  15. char oprt[10];
  16. vector<stree> tree;
  17. int build(int l,int r)
  18. {
  19. stree temp;
  20. int now=maxn++;
  21. tree.push_back(temp);
  22. tree[now].l=l;tree[now].r=r;
  23. if(l==r)
  24. {
  25. tree[now].sum=N[l];
  26. return now;
  27. }
  28. int ls,rs,mid=(l+r)>>1;
  29. ls=build(l,mid);
  30. rs=build(mid+1,r);
  31. tree[now].ls=ls;tree[now].rs=rs;
  32. return now;
  33. }
  34. inline void update(int now,int num)
  35. {
  36. if(tree[now].l==tree[now].r)
  37. {
  38. tree[now].sum+=num;
  39. tree[now].lazy=0;
  40. return;
  41. }
  42. tree[tree[now].ls].lazy+=num;
  43. tree[tree[now].rs].lazy+=num;
  44. tree[now].lazy=0;
  45. }
  46. void add(int l,int r,int num,int now)
  47. {
  48. if(tree[now].lazy!=0)update(now,tree[now].lazy);
  49. if(tree[now].l==l&&tree[now].r==r)
  50. {
  51. tree[now].lazy+=num;
  52. return;
  53. }
  54. int mid=tree[tree[now].ls].r;
  55. if(r<=mid)add(l,r,num,tree[now].ls);
  56. else if(l>mid)add(l,r,num,tree[now].rs);
  57. else
  58. {
  59. add(l,mid,num,tree[now].ls);
  60. add(mid+1,r,num,tree[now].rs);
  61. }
  62. }
  63. int Q(int now,int s)
  64. {
  65. if(tree[now].lazy!=0)update(now,tree[now].lazy);
  66. if(tree[now].l==tree[now].r)return tree[now].sum;
  67. int mid=tree[tree[now].ls].r;
  68. if(s<=mid)return Q(tree[now].ls,s);
  69. else return Q(tree[now].rs,s);
  70. }
  71. int main()
  72. {
  73. freopen("shulieb.in","r",stdin);
  74. freopen("shulieb.out","w",stdout);
  75. scanf("%d",&n);
  76. for(int i=1;i<=n;i++)scanf("%d",&N[i]);
  77. build(1,n);
  78. scanf("%d",&m);
  79. for(int i=1;i<=m;i++)
  80. {
  81. cin>>oprt;
  82. if(oprt[0]=='A')
  83. {
  84. int a,b,c;
  85. scanf("%d%d%d",&a,&b,&c);
  86. add(a,b,c,0);
  87. }
  88. else
  89. {
  90. int s;
  91. scanf("%d",&s);
  92. printf("%d\n",Q(0,s));
  93. }
  94. }
  95. return 0;
  96. }