记录编号 352076 评测结果 AAAAAAAAAA
题目名称 magictree 最终得分 100
用户昵称 GravatarNewBee 是否通过 通过
代码语言 C++ 运行时间 0.494 s
提交时间 2016-11-16 21:14:34 内存使用 122.36 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #define Cu fclose(stdin);fclose(stdout);return 0;
  3. #define Begin freopen("magictree.in","r",stdin);freopen("magictree.out","w",stdout);chul();Cu;
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn=2000010;
  7. ll tree[maxn<<2],lazy[maxn<<2];
  8. int s,t,n;
  9. void build(int rt,int l,int r){
  10. if(l==r){
  11. scanf("%lld",&tree[rt]);
  12. return;
  13. }
  14. int mid=(l+r)>>1;
  15. build(rt<<1,l,mid);
  16. build(rt<<1|1,mid+1,r);
  17. tree[rt]=tree[rt<<1]+tree[rt<<1|1];
  18. }
  19. void update(int rt,int l,int mid,int r){
  20. if(lazy[rt]==0)return;
  21. ll k=lazy[rt];
  22. lazy[rt]=0;
  23. tree[rt<<1]+=(mid-l+1)*k;
  24. tree[rt<<1|1]+=(r-mid)*k;
  25. lazy[rt<<1]+=k;
  26. lazy[rt<<1|1]+=k;
  27. return;
  28. }
  29. ll asks(int rt,int l,int r){
  30. if(s<=l&&t>=r)return tree[rt];
  31. int mid=(l+r)>>1;
  32. update(rt,l,mid,r);
  33. if(t<=mid)return asks(rt<<1,l,mid);
  34. else if(s>mid)return asks(rt<<1|1,mid+1,r);
  35. else return asks(rt<<1,l,mid)+asks(rt<<1|1,mid+1,r);
  36. }
  37. void ques(){
  38. scanf("%d%d",&s,&t);
  39. s++;t++;
  40. printf("%lld\n",asks(1,1,n));
  41. }
  42. void adds(int rt,int l,int r,ll q){
  43. if(s<=l&&t>=r){
  44. tree[rt]+=(r-l+1)*q;
  45. lazy[rt]+=q;
  46. return;
  47. }
  48. int mid=(l+r)>>1;
  49. update(rt,l,mid,r);
  50. if(s<=mid)adds(rt<<1,l,mid,q);
  51. if(t>mid)adds(rt<<1|1,mid+1,r,q);
  52. tree[rt]=tree[rt<<1]+tree[rt<<1|1];
  53. }
  54. void adds(){
  55. ll q;
  56. scanf("%d%d%lld",&s,&t,&q);
  57. s++;t++;
  58. adds(1,1,n,q);
  59. }
  60. void chul(){
  61. int m;
  62. scanf("%d%d",&n,&m);
  63. build(1,1,n);
  64. char c;
  65. for(int i=1;i<=m;i++){
  66. while(c=getchar(),c!='Q'&&c!='C');
  67. if(c=='Q')ques();
  68. else adds();
  69. }
  70. }
  71. int main(){
  72. Begin;
  73. }