[线段树]Luogu P3373 【模板】线段树 2
#include<cstdio>
#include<cstring>
#include<algorithm>
#define R register
#define llt long long int
#define N 100000
using namespace std;
inline void read(llt& x){
char temp=getchar();bool u=0;
for(x=0;temp<'0'||temp>'9';u=temp=='-',temp=getchar());
for(;temp>='0'&&temp<='9';x=x*10+temp-'0',temp=getchar());
if(u)x=-x;
return ;
}
llt n,m,p;
llt A[N];
llt val[N<<2];
llt add[N<<2];
llt mul[N<<2];
inline llt add_(R llt x,R llt y){
return (x+y)%p;
}
inline llt mul_(R llt x,R llt y){
return (x*y)%p;
}
void init(llt k=1,llt l=1,llt r=n){
add[k]=0;
mul[k]=1;
if(l==r){
val[k]=A[l]%p;
return ;
}
R llt mid=(l+r)>>1;
init(k<<1,l,mid);
init(k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
void pushdown(llt &k,llt &l,llt &r,llt &mid){
R llt ls=k<<1,rs=k<<1|1;
val[ls]=mul_(val[ls],mul[k]);
val[rs]=mul_(val[rs],mul[k]);
val[ls]=add_(val[ls],add[k]*(mid-l+1));
val[rs]=add_(val[rs],add[k]*(r-mid));
mul[ls]=mul_(mul[ls],mul[k]);
mul[rs]=mul_(mul[rs],mul[k]);
add[ls]=mul_(add[ls],mul[k]);
add[rs]=mul_(add[rs],mul[k]);
add[ls]=add_(add[ls],add[k]);
add[rs]=add_(add[rs],add[k]);
add[k]=0;
mul[k]=1;
return ;
}
void ch1(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r){
mul[k]=mul_(mul[k],v);
add[k]=mul_(add[k],v);
val[k]=mul_(val[k],v);
return ;
}
R llt mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)ch1(x,y,v,k<<1,l,mid);
if(mid<y)ch1(x,y,v,k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
void ch2(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r){
add[k]=add_(add[k],v);
val[k]=add_(val[k],mul_(v,r-l+1));
return ;
}
R llt mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)ch2(x,y,v,k<<1,l,mid);
if(mid<y)ch2(x,y,v,k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
llt get(llt &x,llt &y,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r)return val[k];
R llt mid=(l+r)>>1;
R llt res=0;
pushdown(k,l,r,mid);
if(x<=mid)res=add_(res,get(x,y,k<<1,l,mid));
if(mid<y)res=add_(res,get(x,y,k<<1|1,mid+1,r));
return res%p;
}
int main(){
R llt i,tmp,x,y;
read(n);
read(m);
read(p);
for(i=1;i<=n;i++)
read(A[i]);
init();
for(i=1;i<=m;i++){
read(tmp);
read(x);
read(y);
switch(tmp){
case 1:{
read(tmp);
ch1(x,y,tmp);
break;
}
case 2:{
read(tmp);
ch2(x,y,tmp);
break;
}
case 3:{
printf("%lld\n",get(x,y));
break;
}
}
}
return 0;
}
[线段树]Luogu P3373 【模板】线段树 2的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- hdu 1754 I Hate It (模板线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) M ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
- 【线段树】【P3372】模板-线段树
百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...
- hdu1698(线段树区间替换模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- Luogu P3960 列队 线段树
题面 线段树入门题. 我们考虑线段树来维护这个矩阵. 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学.再定n+1棵线段树前n棵线段树维护 ...
随机推荐
- C++ 运行时类别识别
运行时动态类型的识别其实应该是多态方面的知识,这里我直接拿来单独成章. dynamic_cast和static_cast 1.static_cast用法如下: static_cast < Typ ...
- GO Slice
一.切片(Slice) 1.1 什么是切片 Go 语言切片是对数组的抽象. Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数 ...
- wpf file embeded resource is readonly,Copy always will copy the file and its folder to the bin folder
Wpf file embeded resource will compile the file into the assembly and it will be readonly and can no ...
- SQL Server 数据库备份语句
); --文件名 DECLARE @date DATETIME; --日期 ); --文件存放路径 SELECT @date = GETDATE(); --获取当前时间 --根据当前时间自动生成文件名 ...
- PlayJava Day006
今日所学: /* 2019.08.19开始学习,此为补档. */ 构造方法没有返回值(即return为空). this:实例(对象)的引用. JVM:①static方法区:存静态数据 ②栈区:引用 ...
- python web框架Flask——csrf攻击
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- 采坑 - LODOP,打印预览
结合 layui.弹出框内容样式如下: 红框表示,左右的内边距. 图一 打印预览的样式如下:红框表示,左右的内边距. 图二 要根据图二的左右内边距,去修改图一的左右内边距.不然会影响正文内容高度的判断 ...
- CTF 入门笔记
站点:http://www.moctf.com/ web1:水题非常简单的题目,直接F12查看元素即可,在HTML代码中,flag被注释了. web2:水题 该题的核心 就是通过HTML代码对输入框进 ...
- 为Dynamics 365 USD设置使用Chrome进程来驻留Web应用程序
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 【React Native】日常踩坑记录_以后将持续更新
作为一名有理想.有抱负的一代iOS程序员,本着“我头发够多,还能学”的原则,我选择了追随那些大佬的脚步,于2018年开始了React Native. 第一步:找文档.准备安装开发环境: 第二步:一步步 ...