利用线段树维护区间加和区间乘

#include<bits/stdc++.h>
#define ll long long
#define ls u<<1
#define rs u<<1|1
using namespace std;
ll mod;
int n,m;
const int maxn = 1e5 + 5;
ll a[maxn];
struct Segtree{int l,r;ll sum;ll add,mul;
}tr[maxn << 2];
void pushup(int u){tr[u].sum = (tr[ls].sum + tr[rs].sum)%mod;
}
void pushdown(int u){tr[ls].sum = (tr[ls].sum*tr[u].mul%mod + tr[u].add*(tr[ls].r - tr[ls].l + 1)%mod)%mod;tr[rs].sum = (tr[rs].sum*tr[u].mul%mod + tr[u].add*(tr[rs].r - tr[rs].l + 1)%mod)%mod;tr[ls].mul = (tr[ls].mul*tr[u].mul)%mod;tr[rs].mul = (tr[rs].mul*tr[u].mul)%mod;tr[ls].add = (tr[ls].add*tr[u].mul + tr[u].add)%mod;tr[rs].add = (tr[rs].add*tr[u].mul + tr[u].add)%mod;tr[u].mul = 1;tr[u].add = 0;
}
void build(int u, int l, int r){tr[u].l = l,tr[u].r = r;tr[u].add = 0,tr[u].mul = 1;if(l == r){tr[u].sum = a[l]%mod;return ;}int mid = l + r >> 1;build(ls, l, mid);build(rs, mid+1, r);pushup(u);
}
void update_mul(int u, int l, int r, ll d){if(tr[u].l >= l && tr[u].r <= r){tr[u].add = (tr[u].add * d)%mod;tr[u].mul = (tr[u].mul * d)%mod;tr[u].sum = (tr[u].sum * d)%mod;return ;} pushdown(u);int mid = tr[u].l + tr[u].r >> 1;if(l <= mid)update_mul(ls, l, r, d);if(r > mid)update_mul(rs, l, r, d);pushup(u);
}
void update_add(int u, int l, int r, ll d){if(tr[u].l >= l && tr[u].r <= r){tr[u].add = (tr[u].add + d)%mod;tr[u].sum = (tr[u].sum + d*(tr[u].r - tr[u].l + 1)%mod)%mod;return ;}pushdown(u);int mid = tr[u].l + tr[u].r >> 1;if(l <= mid)update_add(ls, l, r, d);if(r > mid)update_add(rs, l, r, d);pushup(u);
}
ll query(int u, int l, int r){if(tr[u].l >= l && tr[u].r <= r)return tr[u].sum %mod;pushdown(u);int mid = tr[u].l + tr[u].r >> 1;ll ans = 0;if(l <= mid)ans += query(ls, l, r);if(r > mid)ans += query(rs, l, r);ans %= mod;return ans;
}
int main(){cin >> n >> m >> mod;for(int i = 1; i <= n; i++)cin >> a[i];build(1, 1, n);while(m--){int op,l,r;cin >> op >> l >> r;if(op == 1){ll k;cin >> k;update_mul(1, l, r, k);}else if(op == 2){ll k;cin >> k;update_add(1, l, r, k);} else{cout << query(1, l, r) << endl;}}
}

P3373(线段树)相关推荐

  1. 洛谷 P3373 线段树2

    洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...

  2. 洛谷P3373线段树

    洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...

  3. 洛谷P3373 线段树2(乘法加法lazytag)

    线段树模板题,含lazytag的线段树码量本身就比较大,再加入乘法标记,还要考虑先乘后加的问题,本蒟蒻一调就是几个小时. P3373 [模板]线段树 2https://www.luogu.com.cn ...

  4. P3373(线段树2)

    线段树2 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 x 将某区间每一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,p,分别表示该数列数字的个数. ...

  5. 洛谷P3373线段树2

    题目描述 区间查询区间修改,非常明显的线段树模板,但乘法和加法的结合,使问题有了些小改动: problem: 该题唯一的难点就是加法和乘法的lazytag的处理,设目前区间N.s(即区间和)=x,若先 ...

  6. 洛谷 P3373 线段树模板题

    链接:https://www.luogu.com.cn/problem/P3373 题意:一个区间 三种操作 1 给lr范围内乘一个数 2 给lr范围内加一个数 3 询问lr范围内的和 啊这题真·做了 ...

  7. P3373 【模板】线段树 2

    P3373 [模板]线段树 2 相对于线段树模板1有了区间乘的操作,所以增加了一个乘的延迟标记,当加和乘的次序不同的时候,我们要好好考虑这两个延迟标记对孩子的影响.所以这里我们是采取的是先乘后加. 线 ...

  8. P3373 【模板】线段树 2 (未完待续)

    P3373 [模板]线段树 2 强烈安利这个大佬 超赞!!! 题解 本来以为这个题拿着线段树1的板子改改就好了,但是发现事情并没有那么简单,改了两天... 我们看到这个题其实涉及啦乘法和加法两种运算, ...

  9. 洛谷 P3373 【模板】线段树 2 解题报告

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...

最新文章

  1. SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败
  2. “theform._eventtarget 为空或者不是对象”,解决办法
  3. ARM的嵌入式Linux移植体验之操作系统
  4. 2.4.1 死锁的概念
  5. 系统间通信1:阻塞与非阻塞式通信A
  6. 恍然小悟,去掉Excel的worksheet(工作表)保护的新方法
  7. C#中几种循环语法的比较
  8. 数据库临时表空间设置
  9. 行程日志2010-03-16沙井一村(1)
  10. 管理nuget程序包中搜索不到任何程序包
  11. 54 - 算法 - 动态规划问题 连续子序列和最大
  12. 模糊c均值聚类及python实现
  13. 排列组合公式,用向量叉乘的办法计算平行四边形面积
  14. [运算放大器]佛朗哥笔记 - 信号发生器 - 三角波发生器
  15. 莫言领取诺贝尔文学奖演讲稿(中英文)----讲故事的人
  16. 在web上面显示地图并定位
  17. 科利转债上市价格预测
  18. OGG 抓取进程模式转换(集成模式→经典模式)(integrated→classic)
  19. C++ int、long、long int、long long、uint64_t字节长度
  20. uni-app 微信小程序根据角色动态的更改底部tabbar

热门文章

  1. 做个grub的U盘启动盘,即将grub安装到U盘上面。
  2. Tunnello安装指南
  3. 深圳计算机学校排名2015年,2015深圳各区初中最新排名,10各区学校都有
  4. Android Studio的Signature Versions选择,分别是什么意思
  5. 收藏:学做美食--欢乐年夜饭之神七年糕火焰虾
  6. 直接在html打开ppt,无需频繁跳转 教你在PPT内直接看网页
  7. 微软技术大会-无人机为中国电信巡航基站
  8. 阿里云云安全中心提供基础版、高级版和企业版有什么区别?
  9. 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧
  10. web性能压力测试工具:WebBench详解