[线段树]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棵线段树维护 ...
随机推荐
- iota: Golang 中优雅的常量
阅读约 11 分钟 注:该文作者是 Katrina Owen,原文地址是 iota: Elegant Constants in Golang 有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是 ...
- C# 获取系统硬件可用信息
如何获取系统可用磁盘和可用内存? 1 获取磁盘信息 这个有自带的 DriveInfo 可以用. DriveInfo 类 (System.IO) | Microsoft Docs 2 获取内存信息 参考 ...
- MySQL数据库的事务及存储引擎
一.关系型数据库与非关系型数据库 1.关系型数据库的特点: 1)数据以表格的形式出现 2)每行为各种记录名称 3)每列为记录名称所对应的数据域 4)许多的行和列组成一张表单 5)若干的表单组成数据库 ...
- 如何在CAD中批量打印图纸?这种方法你要知道
CAD图纸都是使用CAD制图软件进行设计出来的,图纸的格式均为dwg格式的,不方便进行使用.就需要将图纸进行打印出来.多张CAD图纸如果一张一张进行打印速度就会非常的慢,那就可以使用CAD中的批量打印 ...
- 专访腾讯方亮:WeTest品牌全面升级,“好的产品一定深谙人性”
工欲善其事,必先利其器.在当下竞争激烈的市场环境中,精品,已经成为所有游戏厂商安身立命之本.但如何提升品质,使产品成为精品,行业内却长期缺乏公开.透明,以及具备实际参考.实操价值的标准. 制定一项标准 ...
- iOS 国际本地化(对新项目集成和已有项目集成)
第一推荐一篇金先生的博客,受益非浅,在这里真诚的感谢 https://www.jianshu.com/p/7cb0fad6d06f金小白 首先金小白先生把两种方式都做了介绍,第一种我就不在过多详细的讲 ...
- 剑指offer 17:合并两个有序链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 链表基础操作考察,难点在于对于输入数据的把握,一定要考虑输入数据的全面性 1.出现 ...
- iOS开发证书那点事儿
iOS开发是用Xcode作为开发工具,Xcode在安装之后就自带了模拟器(Simulator).模拟器是个好工具,它对用户没有任何要求,但是我们必须牢记一件事:开发出来的App最终是要在真机上执行,没 ...
- LeetCode——Department Top Three Salaries(巧妙使用子查询)
The Employee table holds all employees. Every employee has an Id, and there is also a column for the ...
- Object-C一日速成——环境搭建
要我说,想要学习一门语言,搭建好相关的环境可以达到事半功倍的效果,那么今天我们就来聊一聊关于在windows系统上搭建Object-C语言编程环境的那些事. 文章目录 一.基于CodeBlocks的O ...