COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)
//注意取模!
#include<cstdio>
#include<cctype>
using namespace std;
const int N=1e5+5;
int n,mod,Sum[N<<2],aTag[N<<2],mTag[N<<2];
inline int read()
{
int now=0,f=1;register char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=getchar());
return now*f;
}
inline void PushUp(int rt)
{
Sum[rt]=(Sum[rt<<1]+Sum[rt<<1|1])%mod;
}
inline void PushDown(int m,int rt)
{
if(mTag[rt]!=1)
{
mTag[rt<<1]=1ll*mTag[rt<<1]*mTag[rt]%mod;
mTag[rt<<1|1]=1ll*mTag[rt<<1|1]*mTag[rt]%mod;
aTag[rt<<1]=1ll*aTag[rt<<1]*mTag[rt]%mod;
aTag[rt<<1|1]=1ll*aTag[rt<<1|1]*mTag[rt]%mod;
Sum[rt<<1]=1ll*Sum[rt<<1]*mTag[rt]%mod;
Sum[rt<<1|1]=1ll*Sum[rt<<1|1]*mTag[rt]%mod;
mTag[rt]=1;
}
if(aTag[rt])
{
aTag[rt<<1]+=aTag[rt], aTag[rt<<1]%=mod;
aTag[rt<<1|1]+=aTag[rt], aTag[rt<<1|1]%=mod;
Sum[rt<<1]=(1ll*Sum[rt<<1]+1ll*(m-(m>>1))*aTag[rt]%mod)%mod;
Sum[rt<<1|1]=(1ll*Sum[rt<<1|1]+1ll*(m>>1)*aTag[rt]%mod)%mod;
aTag[rt]=0;
}
}
void Build(int l,int r,int rt)
{
mTag[rt]=1;
if(l==r)
{
Sum[rt]=read()%mod;
return;
}
int m=l+r>>1;
Build(l,m,rt<<1),Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void Modify_Add(int l,int r,int rt,int L,int R,int v)
{
if(L<=l && r<=R)
{
aTag[rt]+=v;
if(aTag[rt]>=mod) aTag[rt]-=mod;
Sum[rt]=(1ll*Sum[rt]+1ll*v*(r-l+1))%mod;
return;
}
PushDown(r-l+1,rt);
int m=l+r>>1;
if(L<=m) Modify_Add(l,m,rt<<1,L,R,v);
if(m<R) Modify_Add(m+1,r,rt<<1|1,L,R,v);
PushUp(rt);
}
void Modify_Mult(int l,int r,int rt,int L,int R,int v)
{
if(L<=l && r<=R)
{
aTag[rt]=1ll*aTag[rt]*v%mod;
mTag[rt]=1ll*mTag[rt]*v%mod;
Sum[rt]=1ll*Sum[rt]*v%mod;
return;
}
PushDown(r-l+1,rt);
int m=l+r>>1;
if(L<=m) Modify_Mult(l,m,rt<<1,L,R,v);
if(m<R) Modify_Mult(m+1,r,rt<<1|1,L,R,v);
PushUp(rt);
}
int Query_Sum(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R) return Sum[rt];
PushDown(r-l+1,rt);
int m=l+r>>1;long long res=0;
if(L<=m) res+=Query_Sum(l,m,rt<<1,L,R), res%=mod;
if(m<R) res+=Query_Sum(m+1,r,rt<<1|1,L,R), res%=mod;
return res;
}
int main()
{
freopen("seqb.in","r",stdin);
freopen("seqb.out","w",stdout);
n=read(),mod=read();
Build(1,n,1);
int m=read(),opt,l,r,v;
while(m--)
{
opt=read(),l=read(),r=read();
if(opt==1)
v=read(), Modify_Mult(1,n,1,l,r,v);
else if(opt==2)
v=read(), Modify_Add(1,n,1,l,r,v);
else
printf("%d\n",Query_Sum(1,n,1,l,r));
}
fclose(stdin);fclose(stdout);
return 0;
}
COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)的更多相关文章
- 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****
[codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小 ...
- 【CF52C】Circular RMQ(线段树区间加减,区间最值)
给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)
2216 行星序列 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...
- [P2023][AHOI2009]维护序列(线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- [AHOI2009]维护序列 (线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- vijos 1659 河蟹王国 线段树区间加、区间查询最大值
河蟹王国 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...
- poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和
A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...
随机推荐
- openstack swift节点安装手册2-创建rings
以下步骤需要在controller节点上进行操作: 切换到/etc/swift目录下进行如下操作: 一.创建account ring 1.创建account.builder文件 swift-ring- ...
- 安装java时,配置环境变量classpath的作用
想必大家在安装javaSE或其它版本时会注意到,在配置环境变量path之后,还需要新建一个名为CLASSPATH,变量值设为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt. ...
- Oracle11g的database 和client的区别是什么?
由于工作需要,刚开始接触oracle数据库,完全小白,下载的时候看到有database和client两种类型可供下载,一时不知如何是好,于是网上询问得知其中区别,在此记录一下自己的无知. “datab ...
- Innodb ,MyISAM
1. InnoDB不支持FULLTEXT类型的索引. 2. InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算 ...
- 015_NGINX作为WebSocket Proxy的设置
产研那边有通过nginx代理进行长连接的需求,咱们都知道默认nginx只支持短连接的,使用长连接需要单独配置 一. websocket协议提供创建一种支持在server和client之前双向通信的we ...
- php测试mysql数据库连通性并且在浏览器每一秒输出一次结果
有时候网络环境不稳定,需要测试mysql数据库的连接是否畅通,我们可以通过php脚本实现,具体代码如下,在360浏览器测试通过: <?php /* 循环打印出mysql连接测试 */ heade ...
- 编译安装lamp环境
httpd 2.4.9 + mysql-5.5.33 + php-5.4.29编译安装过程: 准备好以下安装包: mysql-5.5.33-linux2.6-x86_64.tar.gz apr-uti ...
- androidpn 推送系统
(文中部分内容来自网络,如无意中侵犯了版权,请告之!) XMPP协议: XMPP : The Extensible Messaging andPresence Protocol. 中文全称:可扩展通讯 ...
- 同时装了Python3和Python2,怎么用pip
作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- gt_argmax_overlaps = overlaps.argmax(axis=0) ValueError: attempt to get argmax of an empty sequence错误处理
在faster rcnn内进行随机裁剪数据增强,训练一段时间后报错: gt_argmax_overlaps = overlaps.argmax(axis=0) ValueError: attempt ...