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.如何 ...
随机推荐
- C++自学教程第一课——你好世界,我是柠檬鲸。
C++系列教程现在在自己学校的一个博客平台发布,几个朋友一起搭建的 [C++基础教程系列](https://blog.ytmaxoj.org/cpp_basic_liuary-0/) 下面是原来的正文 ...
- js获取url中的参数(解决中文乱码)
这个是封装好的方法: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...
- JDBC插入中文数据出现?号地解决问题
1. 查看jdbc配置是否指定编码 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/te ...
- ArcGIS Server导出shp文件
需求: 在项目中客户提出需要在Web端能够定义条件将后台的数据导出shp文件,并下载. 实现: 基于ArcGIS开发导出矢量数据的服务,用户输入导出数据类型.过滤条件.导出范围等条件,服务能够快速将相 ...
- win 10 自带 Ubuntu 系统的文件位置
win 10 自带 Ubuntu 系统的文件位置 Ubuntu 作为最为流行 Linux 系统中的一种,是用来学习 Linux 相关知识是最好不过的选择.专门搞一个 Ubuntu 系统的电脑不太现实, ...
- c# 杀死占用某个文件的进程
原文:c# 杀死占用某个文件的进程 需要使用微软提供的工具Handle.exe string fileName = @"H:\abc.dll";//要检查被那个进程占用的文件 Pr ...
- Dva框架从初识到上手
引言 最近工作需要用dva框架,同事帮我培训了一下,有一点点认识,在此总结. 当然,以后对dva可能会了解更透彻,文章会不断更新的. 初识 开始看架构代码,没有看文档的时候,不知道里面的几个关键字 ...
- Elastic Search安装-windows
转载自:https://blog.csdn.net/linkkb/article/details/82805145 其中稍作修改 ElasticSearch介绍 ES是一个基于Lucene的分布式全文 ...
- vue项目引入外部字体
1.UI设计图有"华文黑体",担心客户端没有该字体,将"huawen.ttf"字体文件,放入项目中: 2.创建一个font.scss(或font.css)文件: ...
- 锁,Event,semaphore
GIL:全局解释锁:无论开启多少个线程,同一时刻只允许执行一个线程运行(解释器级别,保护数据)锁:两种状态,锁定和未锁定,仅支持两个函数,获得锁和释放锁 多线程抢夺锁时,当某个线程获得锁了,其他的锁都 ...