题目描述 Description

“神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途中计算这个行星序列中某段行星的质量和,以便能及时修正飞船的飞行线路,最终到达目的地,行星序列质量变化有两种形式:

1,行星序列中某一段行星的质量全部乘以一个值

2,行星序列中某一段行星的质量全部加上一个值

由于行星的质量和很大,所以求出某段行星的质量和后只要输出这个值模P的结果即可,小可可被这个任务难住了,聪明的你能够帮他完成这个任务吗?

输入描述 Input Description

第一行两个整数N和P(1<=p<=1000000000);

第二行含有N个非负整数,从左到右依次为a1,a2,…………,an(0<=ai<=100000000,1<=i<=n),其中ai表示第i个行星的质量:

第三行有一个整数m,表示模拟行星质量变化以及求质量和等操作的总次数。从第四行开始每行描述一个操作,输入的操作有以下三种形式:

操作1:1 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai*c

操作2:2 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai+c

操作3:3 t g 表示输出所有满足t<=i<=g的ai的和模p的值

其中:1<=t<=g<=N,0<=c<=10000000

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

输出描述 Output Description

对每个操作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
数据范围及提示 Data Size & Hint

100%的数据中,M,N<=100000

40%的数据中,M,N<=10000

/*
区间加、乘,一直学蓝书写线段树,看了别人的题解才发现他的线段树,虽然快但是适用性不强(标记永久化容易出问题),说一下要点:①change和query都要pushdown②修改时同时修改add和sum③pushdown的时候一定同时修改子节点的sum④询问时不需要传递add参数⑤下放乘法标记时先乘后加
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = ;
ll read(){
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
int n,m;
ll sumv[N<<],addv[N<<],mulv[N<<],val[N<<],mod;
ll cmd,ql,qr,c,ans;
void maintain(int l,int r,int rt){
sumv[rt] = ;
if(r > l) sumv[rt] = (sumv[rt<<] + sumv[rt<<|])%mod;
}
void pushdown(int l,int r,int rt){
if(addv[rt] || mulv[rt] != ){
int m = (l + r) >> ;
addv[rt<<] = (addv[rt<<]*mulv[rt] + addv[rt])%mod;
addv[rt<<|] = (addv[rt<<|]*mulv[rt] + addv[rt])%mod;
mulv[rt<<]=(mulv[rt<<]*mulv[rt])%mod;
mulv[rt<<|]=(mulv[rt<<|]*mulv[rt])%mod;
sumv[rt<<] = (sumv[rt<<]*mulv[rt]%mod + addv[rt]*(m-l+)%mod)%mod;
sumv[rt<<|] = (sumv[rt<<|]*mulv[rt]%mod + addv[rt]*(r-m)%mod)%mod;
addv[rt] = ;
mulv[rt] = ;
}
}
void change(int l,int r,int rt){
if(ql <= l && qr >= r){
if(cmd == ){
mulv[rt] = (mulv[rt]*c)%mod;
addv[rt] = (addv[rt]*c)%mod;
sumv[rt] = (sumv[rt]*c)%mod;
}
else{
addv[rt] = (addv[rt] + c)%mod;
sumv[rt] = (sumv[rt] + c*(r-l+))%mod;
}
}else{
pushdown(l,r,rt);
int m = (l + r) >> ;
if(ql <= m) change(lson);
if(qr > m) change(rson);
maintain(l,r,rt);
}
}
void build(int l,int r,int rt){
mulv[rt] = ;addv[rt] = ;
if(l==r){
sumv[rt] = val[l]%mod;
}else{
int m = (l + r) >> ;
build(lson);
build(rson);
maintain(l,r,rt);
}
}
ll query(int l,int r,int rt,ll add){
if(ql <= l && qr >= r){
return sumv[rt] % mod;
}else{
pushdown(l,r,rt);
int m = (l + r) >> ;
ll ret = ;
if(ql <= m) ret += query(lson,add+addv[rt]);
if(qr > m) ret += query(rson,add+addv[rt]);
return ret % mod;
}
}
int main(){
n = read();
mod = read();
fo(i,,n) val[i] = read();
build(,n,);
m = read();
fo(i,,m){
cmd = read();ql=read();qr=read();
if(cmd != ){
c=read();
change(,n,);
}else{
ans = query(,n,,);
printf("%lld\n",ans);
} }
return ;
}

最新文章

  1. 要想提高PHP的编程效率,你必须知道的要点
  2. mac安装paramiko
  3. hdu3496 二维01背包
  4. hdu 4268 Alice and Bob
  5. pygame系列_原创百度随心听音乐播放器_完整版
  6. 解决使用IIS5.0配置的FTP服务器,客户端浏览器访问时无法获取目录列表的问题。
  7. 如何将angularJs项目与requireJs集成
  8. label 标签
  9. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
  10. RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154
  11. 支撑Pinterest日均1000+次试验的A/B测试平台揭秘
  12. 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
  13. 总结Unity 初学者容易犯的编译与运行时错误
  14. .NET数据采集
  15. js实现ctrl+v上传图片
  16. Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类
  17. 在CAD二次开发中使用状态条按钮
  18. EXP 导出出错解决方案
  19. Sequelize-nodejs-6-Instances
  20. WPF获取窗口句柄

热门文章

  1. 萌新笔记——git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解
  2. 2、实现不同子网之间的信息交流(互相可以PING通)
  3. USACO . Greedy Gift Givers
  4. 一枚招聘信息——分期乐招页面重构/UI开发(8k-12k 深圳 经验1-3年 学历不限 全职)
  5. JAVA中整型的存储和左右移位运算
  6. [LeetCode] Valid Word Square 验证单词平方
  7. NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法
  8. 【WPF】值是枚举的RadioButton 绑定问题
  9. 【WPF】释放图像资源, [删除时报另一进程占用]
  10. 用vue.js学习es6(二):let和const使用