AcWing 1277. 维护序列

#include <bits/stdc++.h>
#define ll long long
#define N 4000010
using namespace std;
ll t[N],a[N],num[N],mt[N],mod;
void build(ll p, ll l, ll r)
{
mt[p]=1;
if(l==r){num[p]=a[l]%mod;return;}
ll mid=(l+r)>>1;
build(p<<1,l,mid);build(p<<1|1,mid+1,r);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
void mp(ll p,ll l,ll r,ll x){mt[p]=mt[p]*x%mod;t[p]=t[p]*x%mod;num[p]=num[p]*x%mod;}
void upd(ll p,ll l,ll r,ll x){t[p]=(t[p]+x)%mod;num[p]=(num[p]+(r-l+1)*x)%mod;}
void pd(ll p,ll l,ll r)
{
ll mid =(l+r)>>1;
mp(p<<1,l,mid,mt[p]);mp(p<<1|1,mid+1,r,mt[p]);
upd(p<<1,l,mid,t[p]);upd(p<<1|1,mid+1,r,t[p]);
mt[p]=1;t[p]=0;
}
void add(ll L,ll R,ll l,ll r,ll p,ll x)
{
if (L<=l&&r<=R){t[p]=(t[p]+x)%mod;num[p]=(num[p]+(r-l+1)*x)%mod;return;}
pd(p,l,r);
ll mid=(l+r)>>1;
if (L<=mid)add(L,R,l,mid,p<<1,x);
if (R>=mid+1) add(L,R,mid+1,r,p<<1|1,x);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
void mc(ll L, ll R, ll l, ll r, ll p, ll x)
{
if (L<=l&&r<=R){t[p]=t[p]*x%mod;mt[p]=mt[p]*x%mod;num[p]=num[p]*x%mod;return;}
pd(p,l,r);
ll mid=(l+r)>>1;
if(L<=mid)mc(L,R,l,mid,p<<1,x);
if(R>=mid+1)mc(L,R,mid+1,r,p<<1|1,x);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
ll Q(ll L,ll R, ll l, ll r, ll p)
{
if (L<=l&&r<=R){return num[p]%mod;}
pd(p,l,r);
ll ans=0,mid=(l+r)>>1;
if(L<=mid)ans+=Q(L,R,l,mid,p<<1);
if(R>=mid+1)ans+=Q(L,R,mid+1,r,p<<1|1);
return ans%mod;
}
int main()
{
ll n, m;
cin>>n>>mod;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
cin>>m;
build(1,1,n);
for (ll i=1,type,l,r,x;i<=m;i++)
{
scanf("%lld", &type);
if(type==1){scanf("%lld%lld%lld", &l,&r,&x); mc(l, r,1,n,1,x);}
else if(type==2){scanf("%lld%lld%lld",&l,&r,&x);add(l,r,1,n,1,x);}
else{scanf("%lld%lld", &l, &r);printf("%lld\n",Q(l,r,1,n,1)%mod);}
}
return 0;
}
AcWing 1277. 维护序列的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
随机推荐
- openstack创建vlan网络并配置网络设备
1.在管理员-->网络-->创建网络. 2.填写网络信息,这里要划分新的VLAN,注意在物理网络中填写的事VLAN,段ID指的是vlan的id 3.创建的网络. 4.创建子网,在里面修改子 ...
- 拉勾、Boss直聘、内推、100offer
BOSS直聘 拉勾.Boss直聘.内推.100offer
- 如何访问pod --- service(7)
一.通过service访问pod 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller ...
- 9.random_os_sys_shutil_shelve_xml_hashlib
此章未能精读,待回顾random模块import randomrandom.random() 随机生成一个0-1之间随机的浮点数random.randint(a,b) 随机生成一个a-b之间的整数 a ...
- githubssh配置
- C语言编译器开发之旅(一):词法分析扫描器
本节我们先从一个简易的可以识别四则运算和整数值的词法分析扫描器开始.它实现的功能也很简单,就是读取我们给定的文件,并识别出文件中的token将其输出. 这个简易的扫描器支持的词法元素只有五个: 四个基 ...
- Sqlflow 之隐私政策(Privacy plolicy)介绍
在大数据技术流行的今天,SQLFlow 可以通过分析各种数据库对象的定义给开发和管理者带来很大的助力.能够让您在大数据时代应对自如,如虎添翼. 在之前的文章中我们已经详细介绍过SQLFlow是什么.能 ...
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...
- NGINX缓存使用官方指南
我们都知道,应用程序和网站一样,其性能关乎生存.但如何使你的应用程序或者网站性能更好,并没有一个明确的答案.代码质量和架构是其中的一个原因,但是在很多例子中我们看到,你可以通过关注一些十分基础的应用内 ...
- return true 和 return false 和 return
1.return false:相当于终止符,干了3件事,阻止默认行为,取消事件冒泡,以及停止回调执行立即返回: 2.return:停止回调执行立即返回: 3.return true:相当于执行符,继续 ...