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

P3373 【模板】线段树 2

题解

样例

输入:

8 10 571373
5929 7152 8443 6028 8580 5449 8473 4237
2 4 8 4376
1 2 8 9637
2 2 6 7918
2 5 8 5681
3 2 8
1 1 5 6482
3 1 5
1 5 8 8701
2 5 8 7992
2 5 8 7806

输出

478836
562114

代码爆0  inginging

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e5+10;
int n,m,x,y,v,opr,mod;
int a[maxn],add[maxn*4];
long long sum[maxn*4];
long long ans;

int qsm(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b%2==1) ans=(ans%mod*a%mod)%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}

inline int read()
{
    int ans=0;
    char last=‘ ‘,ch=getchar();
    while(ch<‘0‘||ch>‘9‘) last=ch,ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘) ans=ans*10+ch-‘0‘,ch=getchar();
    if(last==‘-‘) ans=-ans;
    return ans;
}

void build(int k,int l,int r)
{
    if(l==r)
    {
        sum[k]=a[l];  return ;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    sum[k]=sum[k<<1]+sum[k<<1|1];
}

void Add1(int k,int l,int r,int p)
{
    add[k]+=p;
    sum[k]*=(long long)qsm(p,(r-l+1));
}

void Add2(int k,int l,int r,int p)
{
    add[k]+=p;
    sum[k]+=(long long)(r-l+1)*p;
}

void pushdown1(int k,int l,int r,int mid)
{
    if(add[k]==0) return ;
    Add1(k<<1,l,mid,add[k]);
    Add1(k<<1|1,mid+1,r,add[k]);
    add[k]=0;
}

void pushdown2(int k,int l,int r,int mid)
{
    if(add[k]==0) return ;
    Add2(k<<1,l,mid,add[k]);
    Add2(k<<1|1,mid+1,r,add[k]);
    add[k]=0;
}

void modify1(int k,int l,int r,int x,int y,int v)
{
    if(x<=l&&r<=y) return Add1(k,l,r,v);
    int mid=(l+r)>>1;
    pushdown1(k,l,r,mid);
    if(x<=mid) modify1(k<<1,l,mid,x,y,v);
    if(mid<y) modify1(k<<1|1,mid+1,r,x,y,v);
    sum[k]=sum[k<<1]+sum[k<<1|1];
}

void modify2(int k,int l,int r,int x,int y,int v)
{
    if(x<=l&&r<=y) return Add2(k,l,r,v);
    int mid=(l+r)>>1;
    pushdown2(k,l,r,mid);
    if(x<=mid) modify2(k<<1,l,mid,x,y,v);
    if(mid<y) modify2(k<<1|1,mid+1,r,x,y,v);
    sum[k]=sum[k<<1]*sum[k<<1|1];
}

long long query(int k,int l,int r,int x,int y)
{
    if(x<=l&&r<=y) return sum[k];
    int mid=(l+r)>>1;
    long long res=0;
    pushdown2(k,l,r,mid);
    if(x<=mid) res+=query(k<<1,l,mid,x,y);
    if(mid<y) res+=query(k<<1|1,mid+1,r,x,y);
    return res;
}

int main()
{
    n=read();m=read();mod=read();
    for(int i=1;i<=n;i++)
      a[i]=read();

    build(1,1,n);

    for(int i=1;i<=m;i++)
    {
        opr=read();x=read();y=read();
        if(opr==1)
        {
            v=read();
            modify1(1,1,n,x,y,v);
        }
        if(opr==2)
        {
            v=read();
            modify2(1,1,n,x,y,v);
        }
        if(opr==3)
        {
            ans=query(1,1,n,x,y);
            printf("%ld\n",ans%mod);
        }
    }

    return 0;
}

原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11105832.html

时间: 2024-09-29 05:50:25

P3373 【模板】线段树 2 (未完待续)的相关文章

模板区域[未完待续](会定期的更新哦(有时间就更了))

写这个博客目的就是为了记录下学过的模板方便我这焫鷄复习吧//dalao们绕道 近期学的: (1)来自机房学长jjh大神教的求1~n的所有最小素因数和加上本焫鷄的批注 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath>//求1~n的最小质因数 using namespace std; const int MAXN=1e6+

关于DOM的一些总结(未完待续......)

DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.querySelector("选择器"); 通过所需的元素节点,得到我们想要的数据做运算. 实例2:伸缩二级菜单 这里主要是逻辑判断,不同的逻辑给不同的className来控制样式. 需求是:一级菜单可以都关闭,但最多只有一个能打开.(思路是,每次都将所有的一级菜单关闭,然后仅打开当前点击的元素,并

Dancing Links 小结 (因为之前丢了一次稿,未完待续)

Dancing Links (DLX)是Knuth为了解决精确覆盖问题而提出的算法,很多搜索问题可以转化位精确覆盖问题从而使用Dancing Links解决(效率会比DFS高很多,因为里面常常蕴涵着意想不到的剪枝) 信息学竞赛中的DLX的问题类似网络流,只需建图+贴版即可 参考文献: 1.DLX的原理:Knuth的论文: 原版:http://arxiv.org/abs/cs/0011047 翻译版:http://wenku.baidu.com/view/d8f13dc45fbfc77da269b

whatweb.rb 未完待续

#!/usr/bin/env ruby #表示ruby的执行环境 =begin # ruby中用=begin来表示注释的开始 .$$$ $. .$$$ $. $$$$ $$. .$$$ $$$ .$$$$$$. .$$$$$$$$$$. $$$$ $$. .$$$$$$$. .$$$$$$. $ $$ $$$ $ $$ $$$ $ $$$$$$. $$$$$ $$$$$$ $ $$ $$$ $ $$ $$ $ $$$$$$. $ `$ $$$ $ `$ $$$ $ `$ $$$ $$' $ `$

把握linux内核设计思想系列(未完待续......)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 把握linux内核设计思想(一):系统调用 把握linux内核设计思想(二):硬中断及中断处理 把握linux内核设计思想(三):下半部机制之软中断 把握linux内核设计思想(四):下半部机制之tasklet 把握linux内核设计思想(五):下半部机制之工作队列及几种机制的选择 把握linux内核设计思想(六):内核时钟中断 把握linux内核设计思想(七):内核定时器和

[译]App Framework 2.1 (1)之 Quickstart (未完待续)

最近有移动App项目,选择了 Hybrid 的框架Cordova  和  App Framework 框架开发. 本来应该从配置循序渐进开始写的,但由于上班时间太忙,这段时间抽不出空来,只能根据心情和兴趣,想到哪写到哪,前面的部分以后慢慢补上. App Framework 前生是是叫 jqMobi 注意大家不要和 jQuery Mobile 混淆了,它们是两个不同的框架,一开始我还真混淆了0.01秒. 这里我先翻译一下Quickstart 部分,一是自己工作上用的上,二是也想顺便练练英文,最关键

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

git个人使用总结 —— idea命令行、撤销commit (未完待续)

近期在使用git,最开始在idea界面操作,后来要求用命令行.刚开始还不是很习惯,感觉很麻烦,用了几天后感觉爽极了! 其实git的命令也不是很多,熟悉一段时间就差不多能顺利使用了.使用过程中遇到了各种各样的问题,有些小问题就在这里集中总结一下. 1.idea命令行.git安装后就自带终端git bash,使用起来很方便.但是用idea开发,开发后还要在相应文件夹下打开git bash很麻烦.其实idea也带有终端terminal,在最下方可以找到,在这里就可以执行命令.但是如果是默认方式安装的g

Unity3D快捷键 未完待续

Unity3D 点选Object+F Object在当前视角居中 CTRL+1/2 Scene/Game视图的切换 MonoDevelop CTRL+K  删除光标所在行的该行后面的代码 CTRL + ALT +C  注释/不注释该行 CTRL+ DOWN  像鼠标滚轮一样向下拖 CTRL + UP 像鼠标滚轮一样向上拖 CTRL + F  查找该脚本 CTRL + SHIFT + F 查找全部脚本 CTRL + H 替换代码 CTRL + SHIFT +W 关掉所有脚本 Unity3D快捷键

NOIP2016 那些我所追求的 [未完待续]

人生第一场正式OI [Day -1] 2016-11-17 期中考试无心插柳柳成荫,考了全市第2班里第1(还不是因为只复习了不到两天考试),马上请了一个周的假准备NOIP(数学生物还是回去上课的) 灰哥跟我一块,tlq考吃了没请假 正好下个周老班出去学习了不害怕 星期4所有人都请假了,漫无目的地复习了一天题,参考题解补了一场模拟赛 晚上灰哥因为住宿直接回家了,还让我给XXX送纸条 SD NOIP的群好多人直播,我们就直播了个国际象棋(竟然有人说八皇后,我只升变了两个兵称为皇后),然而竟然默认开启