AHOI 2009

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。

有长为 nn 的数列,不妨设为 a1​,a2​,⋯,an​。有如下三种操作形式:

  • 把数列中的一段数全部乘一个值;
  • 把数列中的一段数全部加一个值;
  • 询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模 P 的值。

输入格式

第一行两个整数 n 和 P;

第二行含有 n 个非负整数,从左到右依次为 a1​,a2​,⋯,an​;

第三行有一个整数 M,表示操作总数;

从第四行开始每行描述一个操作,输入的操作有以下三种形式:

  • 操作 1:1 t g c,表示把所有满足t≤i≤g 的 a_iai​ 改为ai​×c;
  • 操作 2:2 t g c,表示把所有满足t≤i≤g 的 a_iai​ 改为 ai​+c;
  • 操作 3:3 t g,询问所有满足 t≤i≤g 的 a_iai​ 的和模 P 的值。

同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

输出格式

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

样例

样例输入

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

样例输出

2
35
8

样例说明

初始时数列为{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≤t≤g≤n,0≤c,ai​≤10^9,1≤P≤10^9。

测试数据规模如下表所示:n,m<=1e5

______________________________________________________________

线段树维护两个懒惰标记,增加值和乘积
______________________________________________________________
  1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int maxn=1e5+10;
5 ll n,m,p;
6 ll sum[maxn<<2],dels[maxn<<2],delp[maxn<<2];
7 ll a[maxn];
8 void down(ll cur,ll l,ll r)
9 {
10 if(delp[cur]!=1)
11 {
12 sum[cur<<1]=(sum[cur<<1]*delp[cur])%p;
13 sum[cur<<1|1]=(sum[cur<<1|1]*delp[cur])%p;
14 delp[cur<<1]=(delp[cur<<1]*delp[cur])%p;
15 delp[cur<<1|1]=(delp[cur<<1|1]*delp[cur])%p;
16 dels[cur<<1]=(dels[cur<<1]*delp[cur])%p;
17 dels[cur<<1|1]=(dels[cur<<1|1]*delp[cur])%p;
18 delp[cur]=1;
19 }
20 if(dels[cur])
21 {
22 ll mid=(l+r)>>1;
23 sum[cur<<1]=(sum[cur<<1]+dels[cur]*(mid-l+1))%p;
24 sum[cur<<1|1]=(sum[cur<<1|1]+dels[cur]*(r-mid))%p;
25 dels[cur<<1]=(dels[cur<<1]+dels[cur])%p;
26 dels[cur<<1|1]=(dels[cur<<1|1]+dels[cur])%p;
27 dels[cur]=0;
28 }
29 }
30 void build(ll cur,ll l,ll r)
31 {
32 if(l==r)
33 {
34 sum[cur]=a[l]%p;
35 delp[cur]=1;
36 return ;
37 }
38 ll mid=(l+r)>>1;
39 build(cur<<1,l,mid);
40 build(cur<<1|1,mid+1,r);
41 sum[cur]=(sum[cur<<1]+sum[cur<<1|1])%p;
42 delp[cur]=1;
43 }
44 void change1(ll cur,ll l,ll r,ll ql,ll qr,ll x)
45 {
46 if(ql<=l && r<=qr)
47 {
48 sum[cur]=(sum[cur]*x)%p;
49 delp[cur]=(delp[cur]*x)%p;
50 dels[cur]=(dels[cur]*x)%p;
51 return ;
52 }
53 if(dels[cur] || delp[cur]!=1)down(cur,l,r);
54 ll mid=(l+r)>>1;
55 if(ql<=mid)change1(cur<<1,l,mid,ql,qr,x);
56 if(mid<qr)change1(cur<<1|1,mid+1,r,ql,qr,x);
57 sum[cur]=(sum[cur<<1]+sum[cur<<1|1])%p;
58 }
59 void change2(ll cur,ll l,ll r,ll ql,ll qr,ll x)
60 {
61 if(ql<=l && r<=qr)
62 {
63 sum[cur]=(sum[cur]+x*(r-l+1))%p;
64 dels[cur]=dels[cur]+x>=p?dels[cur]+x-p:dels[cur]+x;
65 return ;
66 }
67 if(dels[cur] || delp[cur]!=1)down(cur,l,r);
68 ll mid=(l+r)>>1;
69 if(ql<=mid)change2(cur<<1,l,mid,ql,qr,x);
70 if(mid<qr)change2(cur<<1|1,mid+1,r,ql,qr,x);
71 sum[cur]=(sum[cur<<1]+sum[cur<<1|1])%p;
72 }
73 ll query(ll cur,ll l,ll r,ll ql,ll qr)
74 {
75 if(ql<=l && r<=qr)return sum[cur];
76 if(dels[cur] || delp[cur]!=1)down(cur,l,r);
77 ll ans=0;
78 ll mid=(l+r)>>1;
79 if(ql<=mid)ans+=query(cur<<1,l,mid,ql,qr);
80 if(mid<qr)ans+=query(cur<<1|1,mid+1,r,ql,qr);
81 return ans%p;
82 }
83 int main()
84 {
85 scanf("%lld%lld",&n,&p);
86 for(int i=1;i<=n;++i)scanf("%lld",a+i);
87 build(1,1,n);
88 scanf("%lld",&m);
89 while(m--)
90 {
91 ll op,l,r,x;
92 scanf("%lld",&op);
93 if(op==1)
94 {
95 scanf("%lld%lld%lld",&l,&r,&x);
96 x%=p;
97 change1(1,1,n,l,r,x);
98 }
99 else if(op==2)
100 {
101 scanf("%lld%lld%lld",&l,&r,&x);x%=p;
102 change2(1,1,n,l,r,x);
103 }
104 else
105 {
106 scanf("%lld%lld",&l,&r);
107 cout<<query(1,1,n,l,r)%p<<endl;
108 }
109 }
110 return 0;
111 }

LOJ10129的更多相关文章

随机推荐

  1. 后台返回的json数据,前台需要修改对象的键值名,重新修改数据格式

    //例如,后台返回的数据为: var json = { data: [   {value: 103.95, name: "法拉利"}, {value: 103.2, name: & ...

  2. 访问需要HTTP Basic Authentication认证的资源的c#的实现

    string username="username"; string password="password"; //注意这里的格式哦,为 "usern ...

  3. Service Mesh——微服务中的流量管理中间件

    Service Mesh--微服务中的流量管理中间件 摘自-https://zhuanlan.zhihu.com/p/28794062 Service mesh 与 Cloud Native Kube ...

  4. 九、kafka伪分布式和集群搭建

    伪分布式: 1.先将zk启动,如果是在伪分布式下,kafka已经集成了zk nohup /kafka_2.11-0.10.0.1/bin/zookeeper-server-start.sh /kafk ...

  5. hbase:ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet

    hbase连接deug:DEBUG [main-SendThread(bigdata.server1:2181)] - Reading reply sessionid:0x16f764e7f6e000 ...

  6. Docker环境下升级PostgreSQL

    查阅PostgreSQL官方文档可以得知,官方提供了两种方式对数据库进行升级--pg_dumpall与pg_upgrade. pg_dumpall是将数据库转储成一个脚本文件,然后在新版数据库中可以直 ...

  7. js 的关键字

    1.get / set var test = { _Name: "Limei", _Age: 20, get name() { return this._Name;}, set a ...

  8. STL小结

    \(\mathcal{STL}(\mathcal{Standard\ Template\ Library})\) \(queue\) (队列): 这是一种先进先出的数据结构. 主要操作: 操作 功能 ...

  9. nginx: [emerg] bind() to 0.0.0.0:80 failed (10013:

    问题出现 今天在win10安装nginx时候,启动nginx.exe时在dos窗口出现了这个错误,特此记录一下. 解决方法 上面报错信息的意思大概是:0.0.0:80地址访问不被允许.可能是80端口号 ...

  10. [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

    转载自:http://www.cnblogs.com/joeblackzqq/p/4526589.html From: http://m.blog.csdn.net/blog/langkeziju/1 ...