比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 新史「新幻想史 -现代史-」 最终得分 100
用户昵称 liaoy 运行时间 3.337 s
代码语言 C++ 内存使用 10.02 MiB
提交时间 2017-04-11 21:27:02
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. char ch; bool flr;
  5. inline void read(int &a){
  6. flr=1;
  7. for(ch=getchar();ch>'9'||ch<'0';ch=getchar())if(ch=='-')flr=0;
  8. for(a=0;ch<='9'&&ch>='0';ch=getchar())a=((a+(a<<2))<<1)+(ch^'0');
  9. if(!flr)a=-a;
  10. }
  11. int n,m,qtop,top;
  12. int val[50010];
  13. struct opt{
  14. int x,l,r,num;
  15. int opt;//opt==0表示查询,opt不为0表示修改。特别的。表示修改w
  16. }O[100010],tmp[100010];
  17. long long Ans[50010];
  18. struct node{
  19. int l,r,m;
  20. long long sum,tag;
  21. }Seg[50010<<2];
  22. void Segbuild(int p,int l,int r){
  23. Seg[p].l=l; Seg[p].r=r; Seg[p].m=(l+r)>>1; if(l==r)return;
  24. Segbuild(p<<1,l,Seg[p].m); Segbuild(p<<1|1,Seg[p].m+1,r);
  25. }
  26. void unite(int p){
  27. Seg[p].sum=Seg[p<<1].sum+Seg[p<<1|1].sum+Seg[p].tag*(Seg[p].r-Seg[p].l+1);
  28. }
  29. void Change(int p,int l,int r,int data){
  30. if(Seg[p].l==l&&Seg[p].r==r){
  31. Seg[p].sum+=(long long)data*(r-l+1); Seg[p].tag+=data; return;
  32. }
  33. if(r<=Seg[p].m)Change(p<<1,l,r,data);
  34. else
  35. if(Seg[p].m+1<=l)Change(p<<1|1,l,r,data);
  36. else
  37. Change(p<<1,l,Seg[p].m,data),Change(p<<1|1,Seg[p].m+1,r,data);
  38. unite(p);
  39. }
  40. long long Getsum(int p,int l,int r){
  41. if(Seg[p].l==l&&Seg[p].r==r)return Seg[p].sum;
  42. long long sum=Seg[p].tag*(r-l+1);
  43. if(r<=Seg[p].m)sum+=Getsum(p<<1,l,r);
  44. else
  45. if(Seg[p].m+1<=l)sum+=Getsum(p<<1|1,l,r);
  46. else
  47. sum+=Getsum(p<<1,l,Seg[p].m)+Getsum(p<<1|1,Seg[p].m+1,r);
  48. return sum;
  49. }
  50. void CDQ(int l,int r){
  51. if(l==r)return;
  52. int m=(l+r)>>1,tl,tr,tt;
  53. CDQ(l,m); CDQ(m+1,r);
  54. for(tl=l,tr=m+1;tr<=r;tr++){
  55. if(O[tr].opt)continue;
  56. while(O[tl].x<=O[tr].x&&tl<=m){
  57. if(O[tl].opt)Change(1,O[tl].l,O[tl].r,O[tl].opt);
  58. tl++;
  59. }
  60. Ans[O[tr].num]+=Getsum(1,O[tr].l,O[tr].r);
  61. }
  62. for(tl--;tl>=l;tl--)if(O[tl].opt)Change(1,O[tl].l,O[tl].r,-O[tl].opt);
  63. for(tt=l,tl=l,tr=m+1;tt<=r;tt++)if((tr>r)||(tl<=m&&O[tl].x<=O[tr].x))tmp[tt]=O[tl++];else tmp[tt]=O[tr++];
  64. for(tt=l;tt<=r;tt++)O[tt]=tmp[tt];
  65. }
  66. int main(){
  67. int i,opt,x;
  68. freopen("cdcq_a.in","r",stdin); freopen("cdcq_a.out","w",stdout);
  69. read(n); read(m);
  70. for(i=1;i<=n;i++)read(val[i]);
  71. for(i=1;i<=m;i++){
  72. for(ch=getchar();ch!='Q'&&ch!='M';ch=getchar()); opt=(ch!='Q');
  73. if(opt){
  74. top++;
  75. read(O[top].l); read(O[top].r); read(O[top].opt); O[top].opt=-O[top].opt;
  76. top++;
  77. read(O[top].l); read(O[top].r); read(O[top].opt);
  78. read(x);
  79. O[top].x=O[top-1].x=x;
  80. }else{
  81. qtop++; top++;
  82. read(O[top].l); read(O[top].r); read(O[top].x); O[top].num=qtop;
  83. }
  84. }
  85. Segbuild(1,1,n);
  86. CDQ(1,top);
  87. for(i=1;i<=n;i++)Change(1,i,i,val[i]);
  88. for(i=1;i<=top;i++)if(!O[i].opt)Ans[O[i].num]+=Getsum(1,O[i].l,O[i].r);
  89. for(i=1;i<=qtop;i++)printf("%lld\n",Ans[i]);
  90. }