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.如何 ...
随机推荐
- Luogu P5339 [TJOI2019]唱、跳、rap和篮球
题目 设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数. 那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^ ...
- Python中对 文件 的各种骚操作
Python中对 文件 的各种骚操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getc ...
- vue-split-table【表格合并和编辑插件】
前言 vue-split-table应用的效果图 vue-split-table开源地址,欢迎star,现在已经开源和同步到npm上轻松搞定表格拆分或者合并,编辑,再也不怕被产品怼啦 1.核心源码分析 ...
- Prometheus 2.14.0 新特性
Prometheus 2.14.0 现在(2019.11.11)已经发布,在上个月的 2.13.0 之后又进行了一些修正和改进. 这次最大的新功能是基于 React 的新 UI,与现有 UI 大体相同 ...
- 原生js格式化json和格式化xml的方法
在工作中一直看各位前辈的博客解决各种问题,对我的帮助很大,非常感谢! 之前一直比较忙没有写博客,终于过年有了点空闲时间,可以把自己积累的东西分享下,笔记中的部分函数不是自己写的,都是工作中一点点积累的 ...
- java中构造器(Constructor)
大部分内容转自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml 构造器是一个创建对象时被自动调用的特殊方法,为的是初始化 ...
- Apache 的 httpd.conf 配置文件
http.conf 是 Apache 的配置文件,Apache 的常见配置主要是通过修该文件实现的,修改之后需要 重启 Apache 服务生效. Httpd.conf #Apache 安装目录 Ser ...
- Docker介绍,安装和常用的命令
Docker是Google公司推出的Go语言开发的,基于Linux内核的cgroup,namespace,AUFS类的UnionFS等技术.对进程进行封装格力,属于操作系统层面的虚拟化技术.隔离的进程 ...
- Tensorflow fintune
https://zhuanlan.zhihu.com/p/42183653 tf2.0中有更简单的做法,和keras一样
- 费用流+SPFA ||Luogu P3381【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...