BZOJ1798 维护序列seq

来源:互联网 发布:三维教学动画软件 编辑:程序博客网 时间:2024/06/05 09:04

题目

Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43

1 2 3 4 5 6 7

5

1 2 5 5

3 2 4

2 3 7 9

3 1 3

3 4 7

Sample Output

2

35

8

HINT

【样例说明】

初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。

测试数据规模如下表所示

数据编号
1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

代码

线段树记录区间和,记录加法和乘法的标记。
下传时注意儿子节点要乘上父节点的乘法标记,儿子节点的加法标记也是一样。
用1和0使加法和乘法操作共用一个update函数。

#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#define R0(i,n) for(register int i=0;i<n;++i)#define R1(i,n) for(register int i=1;i<=n;++i)#define cl(x,c) memset(x,c,sizeof x)#define INF 0x7fffffff#define MAXN 110000#define lson k<<1,l,m#define rson k<<1|1,m+1,r#define lc k<<1#define rc k<<1|1using namespace std;typedef long long ll;template <class T> inline void read(T&x){    bool f = false; char ch;    for (ch = getchar(); ch <= 32; ch = getchar());    if (ch == '-') f = true, ch = getchar();    for (x = 0; ch > 32; ch = getchar()) x = x * 10 + ch - '0';    if (f) x=-x;}template <class T> inline void write(T x){    if (x < 0) putchar('-'), x=-x;    if (x < 10)putchar(x+'0');    else write(x/10), putchar(x%10+'0');}ll sum[MAXN<<2],P,mul[MAXN<<2],add[MAXN<<2];int n,m;void push_down(int k,int m){    sum[lc]=(sum[lc]*mul[k]+(m-(m>>1))*add[k])%P;    sum[rc]=(sum[rc]*mul[k]+(m>>1)*add[k])%P;    mul[lc]=mul[lc]*mul[k]%P;    mul[rc]=mul[rc]*mul[k]%P;    add[lc]=(add[lc]*mul[k]+add[k])%P;    add[rc]=(add[rc]*mul[k]+add[k])%P;    mul[k]=1;add[k]=0;}void build(int k,int l,int r){    mul[k]=1;add[k]=0;    if(l==r){        read(sum[k]);        return;    }    int m=(l+r)>>1;    build(lson),build(rson);    sum[k]=(sum[lc]+sum[rc])%P;}void update(int k,int l,int r,int L,int R,int M,int A){    if(l>=L&&r<=R){        sum[k]=(sum[k]*M+(r-l+1)*A)%P;        mul[k]=mul[k]*M%P;        add[k]=(add[k]*M+A)%P;        return;    }    int m=(l+r)>>1;    push_down(k,r-l+1);    if(L<=m)update(lson,L,R,M,A);    if(R>m) update(rson,L,R,M,A);    sum[k]=(sum[lc]+sum[rc])%P;}ll query(int k,int l,int r,int L,int R){    if(l>=L&&r<=R) return sum[k]%P;    int m=(l+r)>>1;    push_down(k,r-l+1);    ll ret=0;    if(L<=m) ret=(ret+query(lson,L,R))%P;    if(R>m)  ret=(ret+query(rson,L,R))%P;    sum[k]=(sum[lc]+sum[rc])%P;    return ret%P;}int main(){    read(n),read(P);    build(1,1,n);    read(m);    int u,v,w,x;    R0(i,m){        read(u);       if(u==1)read(v),read(w),read(x),update(1,1,n,v,w,x,0);        else if(u==2)read(v),read(w),read(x),update(1,1,n,v,w,1,x);        else read(v),read(w),write(query(1,1,n,v,w)),puts("");        }    return 0;}
2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 经典家庭伦txt丝母韵欲d下载 经典家庭伦txt丝母韵欲视频 长篇都市情感小说 经典家庭伦全文 久九九久精品免费视频 91在线中文字幕香蕉人人视频 经典家庭伦txt岳丝母小丹韵欲阅读 碰超上线视频人人视频千人 91青青碰起上线视频人人 车里太挤姑妈坐我腿上做小说 经典家庭伦txt岳丝母小丹韵欲小说 我的丝母欲韵第六节 91在线中文久人人视频动漫 悉母全集动漫完整视频 类别中文动漫中的视频 腐母动漫全集视频时长 86 母汁视频动漫 久99久视频精品免费观看38 难以忍耐动漫视频中文 久九九久手机视频 乳娘家教动漫无删减在线播放 久99久精品视频只有精品 母恋人2017中文 久九九久视频精品6思思 巨母3动漫在线 久99久视频精品免费视频动漫 水柔姐大战儿子视频91 久九九久视频精品 99视频国内99视频在线观 横恋人母日语中字 玖玖视频热线视频大全 九九视频热线视频大全动漫 99ra视频这里只精品 九九久视频热线视频 九九久视频热线视频精品 九九视频本韩视频 9久9久女女视频精品mp4 久99久精品免费观看15 久99久只有视频精品18 久九九久视频精品图片 久了久视频这里精品23