P3373线段树2
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll N=;
ll sum[N<<],lazy1[N<<],lazy2[N<<];
ll a[N];
ll n,m,p; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} void build(ll cnt,ll l,ll r)
{
if(l==r)
{
sum[cnt]=a[l]%p;
return;
}
else
{
ll mid=(l+r)>>;
build(cnt<<,l,mid);
build((cnt<<)|,mid+,r);
sum[cnt]=(sum[cnt<<]+sum[(cnt<<)|])%p;
}
} inline bool cover(ll nl,ll nr,ll l,ll r)
{
return l<=nl&&r>=nr;
} inline bool intersection(ll nl,ll nr,ll l,ll r)
{
return l<=nr&&r>=nl;
} void pushdown(ll cnt,ll l,ll r)
{
ll mid=(l+r)>>;
lazy1[cnt<<]=(lazy1[cnt<<]*lazy2[cnt]+lazy1[cnt])%p;
lazy1[(cnt<<)|]=(lazy1[(cnt<<)|]*lazy2[cnt]+lazy1[cnt])%p;
lazy2[cnt<<]=(lazy2[cnt<<]*lazy2[cnt]%p)%p;
lazy2[(cnt<<)|]=(lazy2[(cnt<<)|]*lazy2[cnt]%p)%p;
sum[cnt<<]=((lazy1[cnt]*(mid-l+)%p)+(sum[cnt<<]*lazy2[cnt]%p))%p;
sum[cnt<<|]=((lazy1[cnt]*(r-mid)%p)+(sum[cnt<<|]*lazy2[cnt]%p))%p;
lazy2[cnt]=;
lazy1[cnt]=;
} void add1(ll cnt,ll nl,ll nr,ll l,ll r,ll a)
{
if(cover(nl,nr,l,r))
{
sum[cnt]=(sum[cnt]+(nr-nl+)*a%p)%p;
lazy1[cnt]=(lazy1[cnt]+a%p)%p;
return ;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
if(intersection(nl,mid,l,r)) add1(cnt<<,nl,mid,l,r,a);
if(intersection(mid+,nr,l,r)) add1(cnt<<|,mid+,nr,l,r,a);
sum[cnt]=(sum[cnt<<]+sum[cnt<<|])%p;
} void add2(ll cnt,ll nl,ll nr,ll l,ll r,ll a)
{
if(cover(nl,nr,l,r))
{
sum[cnt]=(sum[cnt]*a)%p;
lazy1[cnt]=(lazy1[cnt]*a)%p;
lazy2[cnt]=(lazy2[cnt]*a)%p;
return ;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
if(intersection(nl,mid,l,r)) add2(cnt<<,nl,mid,l,r,a);
if(intersection(mid+,nr,l,r)) add2(cnt<<|,mid+,nr,l,r,a);
sum[cnt]=(sum[cnt<<]+sum[cnt<<|])%p;
} ll query(ll cnt,ll nl,ll nr,ll l,ll r)
{
if(cover(nl,nr,l,r))
{
return sum[cnt]%p;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
ll ans=;
if(intersection(nl,mid,l,r)) ans+=query(cnt<<,nl,mid,l,r)%p;
if(intersection(mid+,nr,l,r)) ans+=query(cnt<<|,mid+,nr,l,r)%p;
return ans;
} int main()
{
n=read(),m=read(),p=read();
for(ll i=;i<=n;i++)
a[i]=read();
for(int i=;i<=N<<;i++) lazy2[i]=;
build(,,n);
while(m--)
{
ll k;
k=read();
if(k==)
{
ll l=read(),r=read(),t=read();
add2(,,n,l,r,t);
}
if(k==)
{
ll l=read(),r=read(),t=read();
add1(,,n,l,r,t);
}
if(k==)
{
ll l=read(),r=read();
printf("%lld\n",query(,,n,l,r)%p);
}
}
}
P3373线段树2的更多相关文章
- 洛谷P3373线段树模板2
题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...
- P3373 线段树模板
好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...
- 【luogu P3373 线段树2】 模板
题目链接:https://www.luogu.org/problemnew/show/P3373 lazy标记两个,先乘后加 #include <iostream> #include &l ...
- 洛谷P3373 线段树2(补上注释了)
毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...
- P3373 线段树2(多重标记线段树)题解
题意: 操作有:区间加,区间乘,区间询问求和 思路: 设一个数为\(m*sum+a\),加就变成了\(m*sum+a+a_2\),乘就变成了\(m*m_2*sum+a*m_2\),所以我们设两个标记\ ...
- 洛谷P3373 【模板】线段树 2
P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交 讨论 题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...
- AC日记——【模板】线段树 2 洛谷 P3373
P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...
- 洛谷——P3373 【模板】线段树 2&& B 数据结构
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 线段树维护区间乘法 1.如何 ...
随机推荐
- Linux如何设置在当前目录下打开终端
转:https://blog.csdn.net/iot_flower/article/details/71189816 1. sudo apt-get install nautilus-open-te ...
- 逆向与反汇编实战(一)--PEiD分析复现
1.准备 简介: PEiD(PE Identifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470 种PE 文档 的加壳类型和签名. 整个过程需要测试文件成品:htt ...
- 关于MKNetworking自己维护
关于MKNetworking自己维护 个人比较偏向MKNetworking, 因为在小项目里这个网络请求框架可以说是很轻量级.但是里边有一部分功能缺失或者是功能富余, 以及需要优化的地方. 所以决 ...
- MySQL之表查询
语法执行顺序 from >>>从那张表 where >>> 全局的筛选条件 group by>>> 必须是用在where 之后一组就是为了接下来我 ...
- mysql远程连接只显示部分数据库问题
项目变更了环境,数据库换了环境,所以用navicat连接数据库,结果只能看到部分数据库. 看下高级设置,就只有两个库. 表示很奇怪,难道我的ip被禁止了吗,进入服务器查看连接用户权限 1. 首先查看服 ...
- Divergent series
网址:https://en.wikipedia.org/wiki/Divergent_series
- socket客户端怎么判断http响应数据的结束
前言 原文地址:https://blog.csdn.net/nimasike/article/details/81122784 http连接 短连接 定义:http头不包含Connection: Ke ...
- 七、ARM 指令集
7.1 数据处理指令 7.1.1 数据传送类 MOV 类指令:核内寄存器间的数据传送 加载和存储指令(L/S):核内寄存器与挂在存储器总线上器件的数据传送 注意: 核内寄存器就是 R0-R15 外设寄 ...
- pycharm不支持svn,是需要svn命令行工具没有安装(for windows)
1. 安装svn命令行工具 Subversion for Windows下载https://sourceforge.net/projects/win32svn/?source=typ_redirect ...
- Store generated project files externally
最近项目要从.net转java了,之前java语言就就用过,本着熟悉回顾的想法,决定自己用maven搭建一个基础的ssm框架,一些搭建完毕,程序也能正常运行了.最后对比了别人搭建好的源码,发现他们im ...