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 ...
随机推荐
- python3之requests
1.requests简介 requests是通过urllib3实现自动发送HTTP/1.1请求,它能轻松的实现cookies,登陆验证,代理设置等操作. Python内置的urllib模块,用于访问网 ...
- 【转】Python中的字符串与字符编码
[转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...
- openstack常见问题解决方法总结
一.创建实例失败: 首先用下面命令查看服务是否正常 1. nova-manage service list 如果不正常,则使用下面命令重启,如果还不行,则查看日志, 1. service nova-a ...
- Linux版本Membase无法写入default bucket的问题分析
最近项目中使用的membase发现出了点问题,生产环境中读写各种数据都正常,可是新搭建的开发环境下,只有default bucket写不进去数据,调用store总是返回FALSE,配置文件也是一模一样 ...
- angular下载安装
1.下载安装nodejs 官方地址:https://nodejs.org/en/download/ 2.验证是否安装成功 node -v npm -v 公司内网需要设置代理 npm confi ...
- zabbix通过简单shell命令监控elasticsearch集群状态
简单命令监控elasticsearch集群状态 原理: 使用curl命令模拟访问任意一个es节点可以反馈的集群状态,集群的状态需要为green curl -sXGET http://serverip: ...
- 通达OA批量处理没有结束但前台显示已经结束的流程
问题描述: 通达OA系统出现大量流程没有结束,系统显示结束的问题 通过查询操作系统日志,数据库日志,包括程序日志没有发现异常,通过观察发现大量的流程结束时间都是在2016-02-16 17:32:XX ...
- Android用户界面开发:Fragment
Android用户界面开发:Fragment 1:注意事项 3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包. 3.0 ...
- Java基础:整型数组(int[]、Integer[])排序
Windows 10家庭中文版,java version "1.8.0_152",Eclipse Oxygen.1a Release (4.7.1a), 参考链接:http://w ...
- VIM 键盘符号
:h key-notation //查询键盘符号说明<>> 等于shift + > % 是跳到对应的括号 x 是删除当前字符,即右括号 '' 是跳回左括号 x 删除左括号