Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7

Sample Output

2
35
8

HINT

【样例说明】

初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。

测试数据规模如下表所示
数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

正解:线段树。

这题不难,但是容易出错,所以还是挺有意义的。

我们除了维护一个加法的标记以外,还要维护一个乘法的标记,当我们下放更新乘法标记时,被更新的那个区间的加法标记也要乘上对应的数(这个应该很显然吧。。)。并且我们下放的时候,要先下放乘法标记,再下放加法标记。于是我们就能完美地解决这题了。

  1. //It is made by wfj_2048~
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <complex>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <cstdio>
  8. #include <vector>
  9. #include <cmath>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #define inf (1<<30)
  15. #define ls (x<<1)
  16. #define rs (x<<1|1)
  17. #define N (100010)
  18. #define il inline
  19. #define RG register
  20. #define ll long long
  21. #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
  22.  
  23. using namespace std;
  24.  
  25. ll sum[*N],m[*N],a[*N],n,Q,p;
  26.  
  27. il ll gi(){
  28. RG ll x=,q=; RG char ch=getchar();
  29. while ((ch<'' || ch>'') && ch!='-') ch=getchar();
  30. if (ch=='-') q=-,ch=getchar();
  31. while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
  32. return q*x;
  33. }
  34.  
  35. il void build(RG ll x,RG ll l,RG ll r){
  36. if (l==r){ sum[x]=gi(),m[x]=; return; }
  37. RG ll mid=(l+r)>>;
  38. build(ls,l,mid),build(rs,mid+,r);
  39. sum[x]=sum[ls]+sum[rs]; m[x]=;
  40. if (sum[x]>=p) sum[x]-=p; return;
  41. }
  42.  
  43. il void pushdown(RG ll x,RG ll l,RG ll r){
  44. if (m[x]!=){
  45. sum[ls]*=m[x],sum[ls]%=p;
  46. sum[rs]*=m[x],sum[rs]%=p;
  47. m[ls]*=m[x],m[ls]%=p;
  48. m[rs]*=m[x],m[rs]%=p;
  49. a[ls]*=m[x],a[ls]%=p;
  50. a[rs]*=m[x],a[rs]%=p;
  51. m[x]=;
  52. }
  53. if (a[x]!=){
  54. RG ll mid=(l+r)>>;
  55. sum[ls]+=(mid-l+)*a[x],sum[ls]%=p;
  56. sum[rs]+=(r-mid)*a[x],sum[rs]%=p;
  57. a[ls]+=a[x]; if (a[ls]>=p) a[ls]-=p;
  58. a[rs]+=a[x]; if (a[rs]>=p) a[rs]-=p;
  59. a[x]=;
  60. }
  61. return;
  62. }
  63.  
  64. il void mul(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll c){
  65. if (xl<=l && r<=xr){
  66. sum[x]*=c,sum[x]%=p;
  67. m[x]*=c,m[x]%=p;
  68. a[x]*=c,a[x]%=p;
  69. return;
  70. }
  71. pushdown(x,l,r); RG ll mid=(l+r)>>;
  72. if (xr<=mid) mul(ls,l,mid,xl,xr,c);
  73. else if (xl>mid) mul(rs,mid+,r,xl,xr,c);
  74. else mul(ls,l,mid,xl,mid,c),mul(rs,mid+,r,mid+,xr,c);
  75. sum[x]=sum[ls]+sum[rs]; if (sum[x]>=p) sum[x]-=p; return;
  76. }
  77.  
  78. il void add(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll c){
  79. if (xl<=l && r<=xr){
  80. sum[x]+=(r-l+)*c,sum[x]%=p;
  81. a[x]+=c; if (a[x]>=p) a[x]-=p;
  82. return;
  83. }
  84. pushdown(x,l,r); RG ll mid=(l+r)>>;
  85. if (xr<=mid) add(ls,l,mid,xl,xr,c);
  86. else if (xl>mid) add(rs,mid+,r,xl,xr,c);
  87. else add(ls,l,mid,xl,mid,c),add(rs,mid+,r,mid+,xr,c);
  88. sum[x]=sum[ls]+sum[rs]; if (sum[x]>=p) sum[x]-=p; return;
  89. }
  90.  
  91. il ll query(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr){
  92. if (xl<=l && r<=xr) return sum[x];
  93. pushdown(x,l,r); RG ll mid=(l+r)>>;
  94. if (xr<=mid) return query(ls,l,mid,xl,xr);
  95. else if (xl>mid) return query(rs,mid+,r,xl,xr);
  96. else return (query(ls,l,mid,xl,mid)+query(rs,mid+,r,mid+,xr))%p;
  97. }
  98.  
  99. il void work(){
  100. n=gi(),p=gi(); build(,,n); Q=gi();
  101. for (RG ll i=,type,l,r,c;i<=Q;++i){
  102. type=gi(),l=gi(),r=gi();
  103. if (type==) c=gi(),mul(,,n,l,r,c);
  104. if (type==) c=gi(),add(,,n,l,r,c);
  105. if (type==) printf("%lld\n",query(,,n,l,r));
  106. }
  107. return;
  108. }
  109.  
  110. int main(){
  111. File("seq");
  112. work();
  113. return ;
  114. }

bzoj1798 [Ahoi2009]维护序列的更多相关文章

  1. 【线段树】Bzoj1798 [AHOI2009] 维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  2. BZOJ1798[Ahoi2009]维护序列——线段树

    题目描述     老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成.    有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  3. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  4. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  5. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  6. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  7. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  8. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  9. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

随机推荐

  1. MVC支付宝PC网站接口对接

    PC网站支付接口,请参考支付宝官方文档:https://b.alipay.com/signing/productSet.htm?navKey=all 1.需要提供签约账号.商户密钥 2.代码实现: 支 ...

  2. 菜鸟Scrum敏捷实践系列(一)用户故事概念

    菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 敏捷开发 ...

  3. JQ万能轮播图

    lunbotu.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8">  ...

  4. [译]Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  5. iOS全角符与半角符之间的转换

    iOS全角符与半角符之间的转换 相关资料: 函数『CFString​Transform』中文 详情: 问题 1.17-03-15,「有人在群里边问怎么把『半角』符字符串转换成『全角』字符串?」,百度的 ...

  6. UWP Composition API - New FlexGrid 锁定行列

    如果之前看了 UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包 这篇的童鞋,针对VS2017,需要对应更新一下配置,需要的童鞋点 ...

  7. 自动部署Nginx和nfs并架设Nginx集群脚本

    本人经过多次尝试,简单完成了自动部署Nginx和nfs脚本,并且能够自动部署web反向代理集群,下面详细的阐述一下本人的思路.(以下脚本本人处于初学阶段,写的并不是很完善,所以需要后期进行整理和修正, ...

  8. Ant.SOA微服务框架开源

    开源地址:https://github.com/yuzd/AntServiceStack   框架特色0.Service Management(服务治理) 1.CodeGen Contract Fir ...

  9. 数字千分位处理,number.js,js保留两位,整数强制保留两位小数

    杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 官方文档:https://www.customd.com/articles/14/jquery-number-format-redux 1.千分位 $. ...

  10. Windows下检测文件名大小写是否匹配

    跨平台开发有一个众所周知,但因为只是偶尔受到困扰,一般人不会在意的问题,就是windows对文件名大小写不敏感,而其他平台对文件名大小写敏感.因此可能出现在windows平台开发时一切正常,但部署/打 ...