题目描述 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 ;
}

codevs2216 行星序列的更多相关文章

  1. 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****

    [codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小 ...

  2. 【wikioi】2216 行星序列(线段树)

    http://wikioi.com/problem/2216/ 这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!! 就是,pushdown一定要放在最前面!要不然顺序会错.也就是说,当 ...

  3. codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)

    2216 行星序列  时间限制: 2 s  空间限制: 256000 KB     题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...

  4. BZOJ_1798_&_Codevs_2216_[AHOI_2009]_行星序列_(线段树)

    描述 BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798 Codevs: http://codevs.cn/problem/2216/ ...

  5. COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)

    题目链接 //注意取模! #include<cstdio> #include<cctype> using namespace std; const int N=1e5+5; i ...

  6. codevs 2216 线段树 两种更新方式的冲突

    题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决 ...

  7. BSOJ 4591 -- 【JLOI2015】城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用m个骑士攻占n个城池. 这n个城池用1到n的整数表示.除1号城池外,城池i会受到另一座城池fi的管辖,其中fi 每个城池有一个防御值h ...

  8. 小结:线段树 & 主席树 & 树状数组

    概要: 就是用来维护区间信息,然后各种秀智商游戏. 技巧及注意: 一定要注意标记的下放的顺序及影响!考虑是否有叠加或相互影响的可能! 和平衡树相同,在操作每一个节点时,必须保证祖先的tag已经完全下放 ...

  9. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

随机推荐

  1. node 异步回调解决方法之yield

    先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require( ...

  2. 程序设计模式浅析(plain framework商业版设计模式)

    程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...

  3. js小技巧

    js判断字符长度 直接使用String对象的属性,空格亦算一个字符 myString = "Hello world"; length = myString.length js比较字 ...

  4. hibernate延迟加载

    http://blog.csdn.net/xc635960736/article/details/7049863 http://www.cnblogs.com/xiaoluo501395377/p/3 ...

  5. [No000092]SVN学习笔记3-Import/Checkout(迁入/迁出),GetLock(加锁)

    一.TortoiseSVN Client 获取服务器端的文件到新的本地文件夹 1.在本地新文件夹上右键菜单: 2.打开Repo-browser(可能需要输入你的用户名&密码) 3.输入服务器端 ...

  6. mysql workbench如何把已有的数据库导出ER模型

    mysql workbench的特长是创建表结构的,然后在结构图中,圈圈点点,很容易就利用可视化方式把数据库建好,然后再导入到数据库服务器中,这种办法很效率.但是有时我们有一个需求,事先没有建表结构模 ...

  7. webgl巧妙方式写着色器代码

    var VSHADER_SOURCE = function(){ /* void main(){ gl_Position = vec4(0.0,0.0,0.0,1.0); gl_PointSize = ...

  8. phabricator-zh_CN汉化包

    https://github.com/wanthings/phabricator-zh_CN 之前公司用这个做任务管理.可以将一些安排计划等指派给某个人跟进进度. 这个系统都是英文的,这是个缺憾.我找 ...

  9. Linux 信号量详解一

    信号量主要用于进程间(不是线程)的互斥,通过sem_p()函数加锁使用资源,sem_v函数解锁释放资源,在加锁期间,CPU从硬件级别关闭中断,防止pv操作被打断. semget函数 int semge ...

  10. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...